5

我们有一个堆内存不足错误,但是(只是出于好奇而问)单个堆栈的大小是否有等效限制?如果不是,那么如果堆栈帧(如数千个局部变量等)需要过多的内存,那么如何防止这种溢出?

4

3 回答 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

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

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

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 回答