1:当Eden内存不够时,会触发一次minor gc,过程是:通过gcRoot标记区分垃圾费垃圾,把非垃圾的obj copy到Survivor s0(s1)中,垃圾的obj直接释放掉,提供内存空间使用。
2:在obj放入Survivor时,会进行标识此obj一个属性“分代年龄”;当Eden“第二次”发送minor gc时,除重复1动作外,非垃圾copy-》s1,另外Survivor区s0还会判断下,之前存入的obj引用情况,再次进行标记“垃圾-非垃圾”,把空的当作垃圾释放掉,非垃圾直接copy-》s1区,并且obj“分代年龄+1”(年龄达到15 -》老年代);以后发生minor gc重复2的动作(s0和s1来回切换,年龄+1)
1002补充: 发生minor gc时,还可能存在一种现象:当Surivor的s0/s1放不下Eden的非垃圾对象,此时会把多出来的对象直接放到oldGen老年代中;放得下此现象不会出现。 所以总结下old Gen数据来源两个层:一是分代年龄大到15,另一个就是minor gc时,Surivor存不下
``````2.1 分代年龄存放在“对象头”中,一个Object不仅仅有“实例数据”还有header,如图
思考:"什么样的对象存在老年代" eg: static finally修饰的变量,数据库连接池,model,controller持久使用的
4: STW 当发生minor gc或 full gc时都将触发stw(stop the world);