Java虛擬機(JVM)的內存分配策略主要涉及堆內存和棧內存的管理。以下是一些關鍵點:
堆內存(Heap Memory):
- 新生代(Young Generation):用于存儲新創建的對象。新生代又分為Eden區和兩個Survivor區(通常稱為S0和S1)。大多數新對象最初分配在Eden區。
- 老年代(Old Generation):用于存儲生命周期較長的對象。當對象在新生代中經過多次垃圾回收仍然存活時,會被移動到老年代。
- 永久代/元空間(Permanent Generation/Metaspace):存儲類的元數據。在Java 8之前,永久代用于存儲類信息、常量、靜態變量等;從Java 8開始,永久代被移除,取而代之的是元空間。
棧內存(Stack Memory):
- 每個線程都有自己的棧內存,用于存儲局部變量、方法調用信息(如方法的參數、返回地址)等。
- 棧內存是線程私有的,生命周期與線程相同。
內存分配策略:
- 對象優先在Eden區分配:大多數情況下,對象在Eden區分配。當Eden區沒有足夠的空間時,會觸發一次Minor GC。
- 大對象直接進入老年代:對于特別大的對象,JVM可以直接將其分配到老年代,以避免在新生代的復制過程。
- 長期存活的對象進入老年代:對象在新生代中經歷一定次數的垃圾回收后(由參數MaxTenuringThreshold控制),會被移動到老年代。
垃圾回收(Garbage Collection):
- Minor GC:主要在新生代進行,回收短生命周期的對象。
- Major GC(或Full GC):在老年代進行,通常是因為老年代空間不足而觸發,回收長生命周期的對象。
- 元空間回收:在Java 8及以后,類的元數據存儲在元空間中,使用本地內存,垃圾回收會回收不再使用的類元數據。
這些策略和機制共同作用,以優化內存使用和提高程序的性能。JVM提供了多種參數和選項來調整這些行為,以便開發者根據具體應用需求進行優化。