堆栈帧大小是否有上限

时间:2013-10-25 06:02:05

标签: java jvm stack heap out-of-memory

我们对堆有一个内存不足的错误但是(只是出于好奇心)是否存在对单个堆栈大小的等效限制?如果没有,那么如果堆栈帧需要多余的内存(如数千个本地变量等),那么是什么阻止了这种溢出?

3 个答案:

答案 0 :(得分:4)

如果线程请求的堆栈空间多于可用堆栈空间,则会收到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

答案 1 :(得分:1)

我认为,分配给运行时堆栈的空间适用于单个执行线程上的所有堆栈帧。

大多数操作系统的默认大小不同。看看这些文档。如果需要使用-Xss JVM参数,可以增加大小。

http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

答案 2 :(得分:0)

每个线程都有自己的堆栈空间分配。您可以使用Java命令行上的-Xss选项设置此分配的大小;不同平台上的默认值是不同的,但它总是“每线程”数量。

限制是每个线程的内存量,而不是堆栈中的条目数。