我们有一个堆内存不足错误,但是(只是出于好奇而问)单个堆栈的大小是否有等效限制?如果不是,那么如果堆栈帧(如数千个局部变量等)需要过多的内存,那么如何防止这种溢出?
问问题
2057 次
3 回答
5
如果一个线程请求的堆栈空间比它可用的多,它会收到一个 StackOverflowError。
http://docs.oracle.com/javase/7/docs/api/java/lang/StackOverflowError.html
单个堆栈帧的大小在编译时确定,并与方法的代码一起存储在类文件中。实际上有两个字段:局部变量数组的大小和操作数堆栈的深度。两者都限制为 2^16-1。http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546
于 2013-10-25T06:05:46.847 回答
1
我认为,分配给运行时堆栈的空间是为单个执行线程上的所有堆栈帧组合的。
大多数操作系统的默认大小不同。看看这些文档。如果需要,您可以使用-Xss
JVM 参数增加大小。
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html
于 2013-10-25T06:07:17.017 回答
0
每个线程都有自己的堆栈空间分配。您可以使用 Java 命令行上的 -Xss 选项设置此分配的大小;默认值在不同平台上有所不同,但始终是“每个线程”的数量。
限制是每个线程的内存量,而不是堆栈上的条目数。
于 2013-10-25T06:11:07.490 回答