Java 年輕代、年老代、GC


一篇關於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策略是:標記整理法。年老代的容量很大,使用停止復制法的話,效率會比較低。標記整理法,是先標記存活的對象,然后把這些對象在向一段移動,保證內存的連續。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM