在 Java 中,對象的創建通常情況下是在堆上。
- 基本數據類型(如
byte
、short
、int
、long
、float
、double
、char
)在方法內聲明時,其值會存儲在棧上。 - 除了基本數據類型之外的所有對象,都是由 Java 虛擬機(JVM)在堆上創建,然后將指向這些對象的引用存放在虛擬機棧的局部變量表中。
但是,值得注意的是,并非所有的對象都會在堆上存儲。這取決于 JVM 的一種優化技術,稱為逃逸分析。逃逸分析主要有兩種類型:
-
方法逃逸:如果一個對象在方法內定義后,有可能被該方法之外的其他方法訪問(例如,作為參數傳遞給其他方法),則這個對象會在堆上分配。
-
線程逃逸:如果一個對象在方法內定義后,有可能被其他線程訪問,它也會在堆上分配。
如果對象不滿足逃逸分析的條件,它們則會在棧上分配。棧上分配的優勢在于,當方法執行完成后,其占用的內存會立即被釋放,無需等待垃圾回收器的介入。
綜上所述,盡管大部分對象都是在堆上分配的,逃逸分析能夠優化一部分對象的內存分配策略,從而提高程序的性能。