對JVM中垃圾回收機制的個人理解--新生代,老年代,永久代

qq_28750155發表於2016-01-25

就想通過這個方式看看自己看完一遍書後還記得什麼...

不管怎麼樣要先來個帥氣的開場白:有錯的地方請多指正,3q!!!!!!!!!!!!!!!!!!!!!!!

在堆中,新生代主要存放的是哪些很快就會被GC回收掉的或者不是特別大的物件(這個大就要看你是否設定了-XX:PretenureSizeThreshold 引數了)。新生代採用的複製演算法,即將新生代分為3個區:較大的Eden和兩個較小的Survivor(預設的Eden:Survivor = 8:1)。發生在新生代的GC為Minor GC 。在Minor GC時會將新生代中還存活著的物件複製進一個Survivor中,然後對Eden和另一個Survivor進行清理。所以,平常可用的新生代大小為Eden的大小+一個Survivor的大小。


老年代則是存放那些在程式中經歷了好幾次回收仍然還活著或者特別大的物件(這個大就要看你是否設定了-XX:PretenureSizeThreshold 引數了)。老年代採用的是標記-清除或者標記-整理演算法,這兩個演算法主要看虛擬機器採用的哪個收集器,兩種演算法的區別是:標記-清除可能會產生大量連續的記憶體碎片。在老年代中的GC則為Major GC。Major GC和Full GC會造成stop-the-world。


那麼什麼情況下,新生代的物件會進入老年代呢?

首先就是分配擔保機制:當Minor GC時,新生代存活的物件大於Survivor的大小時,這時一個Survivor裝不下它們,那麼它們就會進入老年代。

還有其他的情況:如果設定了-XX:PretenureSizeThreshold3M 那麼大於3M的物件就會直接就進入老年代。

還有,在新生代的每一次Minor GC 都會給在新生代中的物件+1歲,預設到15歲時就會從新生代進入老年代,可以通過-XX:MaxTenuringThreshold來設定這個臨界點。

相比較而言,在老年代中的物件比新生代中的物件不易回收許多。


JVM的方法區,也被稱為永久代。在這裡都是放著一些被虛擬機器載入的類資訊,靜態變數,常量等資料。這個區中的東西比老年代和新生代更不容易回收。



相關文章