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策略是:标记整理法。年老代的容量很大,使用停止复制法的话,效率会比较低。标记整理法,是先标记存活的对象,然后把这些对象在向一段移动,保证内存的连续。

扫描二维码关注公众号,回复: 4505015 查看本文章

猜你喜欢

转载自www.cnblogs.com/afraidToForget/p/10120380.html