对于堆,我们有一个内存不足的错误,但是(出于好奇地问),单个堆栈的大小是否有一个等效的限制?如果没有,那么如果堆栈帧需要多馀的内存(如数千个局部变量等),那么如何防止这种溢出呢?
发布于 2013-10-25 06:05:46
如果线程请求的堆栈空间比可用的要大,那么它将接收到一个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-25 06:07:17
我认为,分配给运行时堆栈的空间是单个执行线程上所有堆栈帧的总和。
大多数OSes的默认大小不同。看看这些医生。如果需要使用-Xss JVM参数,可以增加大小。
jvm/jrockit/jrdocs/refman/optionX.html
发布于 2013-10-25 06:11:07
每个线程都有自己的堆栈空间分配。您可以在Java命令行上使用-Xss选项设置此分配的大小;默认情况在不同平台上不同,但始终是“每个线程”的数量。
限制是每个线程的内存量,而不是堆栈上的条目数。
https://stackoverflow.com/questions/19582194
复制相似问题