[英]Size taken by stack frame
Java堆棧為每個方法調用創建新框架,但是這個框架是否在堆棧上占用內存?
澄清我的問題:
public void oneWay()
{
System.out.println("start");
get1();
}
private void get1()
{
System.out.println("get1");
get2();
}
private void get2()
{
System.out.println("get2");
}
輸出與以下相同:
public void anotherWay()
{
System.out.println("start");
System.out.println("get1");
System.out.println("get2");
}
但是第二個代碼片段在堆棧上占用的內存是多少還是相等? 簡而言之,堆棧框架會記憶嗎?
編輯:堆棧幀占用多少內存? Sun有沒有任何規范,現在是Oracle?
是的,很自然。 這就是為什么如果嵌套太深,你會得到堆棧溢出的原因。 如果發現需要為線程設置更大(或更小)的堆棧,可以使用-Xss
命令行開關來修改堆棧大小。
規范似乎允許實現的很大自由,所以總而言之,你不能真正依賴堆棧幀大小。
您可以將當前線程堆棧上的堆棧幀數計為:
Thread.currentThread().getStackTrace().length
在你的情況下,在get2
獲取此值會比直接在oneWay
獲得更大的值(大於2)。 確切的值取決於代碼中您調用oneWay
。 雖然其他一些編程語言不一定為每個函數調用創建一個堆棧幀,但Java總是如此。 JVM規范在§2.6中明確指出“每次調用方法時都會創建一個新幀”。 以后“框架從Java虛擬機堆棧分配”。 因此在Java中,每個方法調用都會設置一個堆棧幀,每個堆棧幀都會占用堆棧上的內存。 即使在調用不執行任何操作的函數時,虛擬機也需要一定量的內存來跟蹤堆棧幀本身。
如Java虛擬機內部所述 ,
堆棧幀有三個部分:局部變量,操作數堆棧和幀數據。 局部變量和操作數堆棧的大小(以單詞計量)取決於每個單獨方法的需要。 這些大小在編譯時確定,並包含在每個方法的類文件數據中。 幀數據的大小取決於實現。
當Java虛擬機調用Java方法時,它會檢查類數據以確定方法在局部變量和操作數堆棧中所需的字數。 它為方法創建了適當大小的堆棧幀,並將其推送到Java堆棧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.