【发布时间】:2013-11-04 02:53:17
【问题描述】:
我们有一个堆内存不足的错误,但是(只是出于好奇而问)单个堆栈的大小是否有等效限制?如果不是,那么如果堆栈帧(如数千个局部变量等)需要过多的内存,那么如何防止这种溢出?
【问题讨论】:
标签: java jvm out-of-memory heap-memory stack-memory
我们有一个堆内存不足的错误,但是(只是出于好奇而问)单个堆栈的大小是否有等效限制?如果不是,那么如果堆栈帧(如数千个局部变量等)需要过多的内存,那么如何防止这种溢出?
【问题讨论】:
标签: java jvm out-of-memory heap-memory stack-memory
每个线程都有自己的堆栈空间分配。您可以使用 Java 命令行上的 -Xss 选项设置此分配的大小;默认值在不同平台上有所不同,但始终是“每个线程”的数量。
限制是每个线程的内存量,而不是堆栈上的条目数。
【讨论】:
如果线程请求的堆栈空间超出其可用空间,则会收到 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
【讨论】:
number of stack frames 更多时会发生堆栈溢出。我说的是 individual stack 占用大量空间
我认为,分配给运行时堆栈的空间是为单个执行线程上的所有堆栈帧组合的。
大多数操作系统的默认大小不同。看看这些文档。如果需要,您可以使用-Xss JVM 参数增加大小。
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html
【讨论】: