首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 內存模型:對象包含的基本類型字段存儲在堆還是棧?

     編輯:程式設計疑難解答

結論先行

對象實例及其所有字段(基本類型、引用類型)均存儲在堆內存中。

詳細解析

數據類型變量本身存儲位置指向的數據存儲位置
基本類型局部變量 棧幀 棧幀 (值直接存儲)
引用類型局部變量 棧幀 堆 (對象實例)
對象實例字段 (基本類型) 堆 (對象實例內部) 堆 (對象實例內部,值直接內聯)
對象實例字段 (引用類型) 堆 (對象實例內部) 堆 (另一個對象實例)
靜態字段 元空間 / 堆 (類對象) 堆 (對象實例) 或 元空間 (基本類型值)

記憶口訣

「凡是 new 出來的,都在堆;方法裡定義的變量,在棧。」
對象是 new 出來的,所以對象整體(含基本類型字段)在堆。

驗證代碼

public class HeapDemo {
    int primitiveField = 42;      // 基本類型字段
    String referenceField = "hi"; // 引用類型字段

    public static void main(String[] args) {
        HeapDemo obj = new HeapDemo(); // obj 引用在棧,對象實例在堆
        // obj.primitiveField (42) 存儲在堆中 obj 實例的內存佈局裡
        // obj.referenceField 指向堆中另一個 String 對象
    }
}

補充:逃逸分析與標量替換

JIT 編譯器若發現對象未逃逸出方法,可能將其標量替換為局部變量,字段值直接存入棧幀/寄存器,但這是運行時優化行為,不改變語言規範語義。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved