JVM 新生代,老年代,永久代

在堆中,新生代主要存放的是哪些很快就會被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的方法區,也被稱爲永久代。在這裏都是放着一些被虛擬機加載的類信息,靜態變量,常量等數據。這個區中的東西比老年代和新生代更不容易回收。d3

相關文章
相關標籤/搜索