JVM中GC机制的个人理解-LMLPHP

该图代表jvm中的新生代,老年代,持久代;  新生代和老年代主要指堆区(管理对象),持久代主要指方法区(因为方法区里是类信息,静态变量,常量等需要“持久”的信息);我们这里主要看堆区的gc;

新生代:里主要分为Eden Space  和Survivor两块;Eden代表“伊甸园”,新生的对象都会放到这里,Survivor (翻译为幸存,这里我理解为在Eden区gc时,未被回收的对象会放到这个辛存区;)又包括FromSpace和ToSpace两个区域,这两个区域大小是一样的;FromSpace我理解为进行复制算法的来源区,ToSpace理解为要放的地方;

老年代:主要存放经过多次gc还存活的对象,新生代的对象可以设置年龄阀值,超过年龄阀值的对象会转到老年代;老年代采用的是标记压缩算法(相较于标记清除算法不会产生内存碎片)

总结理解:在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

补充方法区和持久代的关系:方法区物理上存在于堆里,而且是在堆的持久代里面;但在逻辑上,方法区和堆是独立的。
                                           一般说堆的持久代就是说方法区;

参考:https://www.cnblogs.com/nantang/p/5674793.html

06-18 05:30