簡體   English   中英

堆棧框架占用的大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM