[英]Is there a upper limit on stack frame size
我們有一個堆的內存不足錯誤但是(只是出於好奇心)是否有單獨堆棧大小的等效限制? 如果沒有,那么如果堆棧幀需要多余的內存(如數千個本地變量等),那么是什么阻止了這種溢出?
如果一個線程請求的堆棧空間多於可用堆棧空間,則會收到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
我認為,分配給運行時堆棧的空間適用於單個執行線程上的所有堆棧幀。
大多數操作系統的默認大小不同。 看看這些文檔。 如果需要使用-Xss
JVM參數,可以增加大小。
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html
每個線程都有自己的堆棧空間分配。 您可以使用Java命令行上的-Xss選項設置此分配的大小; 默認值在不同平台上有所不同,但它始終是“每個線程”的數量。
限制是每個線程的內存量,而不是堆棧上的條目數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.