1. 程式人生 > >JVM 內存分配與回收策略

JVM 內存分配與回收策略

要求 VM 大數 足夠 minor 直接進入老年代 OS 情況 內存分配

  Java堆是垃圾收集器管理的主要區域。因為基本采用分代收集算法,所以Java堆可以細分為新生代和老年代,更細致是Eden、From Survivor和To Survivor。劃分的目的是更好地回收內存或更快地分配內存。根據JVM規範,Java堆可以處於物理上不連續的內存空間中,要求邏輯上連續。

  1 對象優先在Eden區中分配

  大多數情況下,對象在新生代Eden區中分配。當Eden區沒有足夠空間分配時,虛擬機發起一次Minor GC。

  2 大對象直接進入老年代

  大對象指需要大量連續內存空間的Java對象,例如很長的字符串和大數組。大對象對於JVM的內存分配來說是一個壞消息,比遇到一個大對象更壞的消息是遇到一群“朝生夕滅”的“短命大對象”,經常出現大對象容易導致內存還有不少空間時提前觸發垃圾收集以獲取足夠的連續空間來“安置”它們。

  3 長期存活的對象將進入老年代

  JVM給每個對象定義了一個對象年齡(Age)計數器。如果對象在Eden區分配並經過第一次Minor GC後仍然存活,並且能被Survivor容納,則將該對象移動到Survivor空間中,對象年齡設為1。對象在Survivor區中每“熬過“一次Minor GC,年齡增加1歲,當年齡增加到一定程度(默認為15歲),晉升到老年代。

  

  新生代GC(Minor GC):因為Java對象大多具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度比較快。

  老年代GC(Full GC / Major GC):經常會伴隨至少一次的Minor GC。Major GC的速度一般會比Minor GC慢10倍以上。

  

  參考資料

  《深入理解Java虛擬機 JVM高級特性與最佳實踐 第2版》P41 P91-97

JVM 內存分配與回收策略