Java 年輕代、年老代、GC
阿新 • • 發佈:2018-12-14
一篇關於gc的文章
http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html
自己的筆記:
JVM是用c語言寫的。一般說的JVM是HotSpot。
GC是垃圾回收的意思。
Java的GC對不同存活時長的物件才用不同的回收策略。
存活時間短的物件使用新生代儲存,存活時間長的物件使用年老代儲存。
一般情況下,一個物件剛建立的時候被存放在年輕代,在年輕代經過幾次gc後仍然存活,則進入年老代。特殊情況下:如果一個物件很大,也可以直接進入年老代。有的建議說需要避免建立大的物件。年老代的空間很大,當一個大的物件在老年代gc的時候,會引發整個年老代的gc。對於年老代引用年輕代物件的情況,年老代中會維護一個大小為512byte的card table。年輕代gc的時候可以查詢這裡,而不用查詢全部年老代。
年輕代的gc策略是:停止複製清理法。年輕代具體分為伊甸區、存活區0,存活區1;gc時候將仍然存活的物件放入一個存活區中,清空另一個存活區和伊甸園區。如果某個物件經過了n次gc依然存活,或者存活的物件超過了存活區的容量,就會發生從年輕代到年老代的複製。 停止複製清理法需要在回收前停止其他所有執行緒的執行,這是新生代收集器優化的重點(垃圾收集器是gc的具體實現)。
年老代的gc策略是:標記整理法。年老代的容量很大,使用停止複製法的話,效率會比較低。標記整理法,是先標記存活的物件,然後把這些物件在向一段移動,保證記憶體的連續。