因为找视频耽误了点时间,现在补一下jvm的后续内容以作记录
堆:大部分的对象创建都是在“堆”中生成的,今天就来详细跟进一下堆;
目录
5.当“老年代”执行Full GC 都无法清空对象,并且已经放满的时候
结构:
生命周期:
1.对象创建优先放入Eden区内
(若此时Eden区已经放满了对象,那么会触发minor gc)
2.当我们再往放满对象的Eden区中继续放对象的时候
java底层的“字节码执行引擎”会开启一个垃圾收集线程,对Eden区中的垃圾对象进行收集,把他们清理掉,从而空出更多的空间,让新的对象放入进来
(minor gc的执行机制:“可达性分析算法”
GC Roots :线程栈的本地变量、静态变量、本地方法栈的变量等,都称为GC Roots 根 节点
过程:先从栈、方法区中找到GC Roots 从这些根节点出发,去找有引用的对象,继续找 该对象的成员变量引用的其他对象,如此循环,直到最后一个对象中不再引用其他对象。 凡是这些一条关联的对象都会标记为“非垃圾对象”,会将这些非垃圾对象移至“Survivor区” (Survivor区共有两块区域)中。
此时 Eden区中剩余的对象就是垃圾对象,就会一次性干掉。
这里插入两个个jvm的调优工具:jvisualvm/arthas
)
3. 当Eden区再次放满的时候
就会再次执行minor gc,执行上述过程,将Eden区和非空的Survivor区中放满的“非垃圾对象”放入到另外一块空的“Survivor区”中,再将刚才两块的区域清空。
分代年龄:每当对象被执行过一次minnor gc被保留下来,他的分代年龄会加1
分代年龄是放在对象的对象头中的(ObjectHeader)此 处留下 后面再进行学习。
当分代年龄达到15的时候,该对象会被放入到“老年区”。(例如线程池对象,数据 库连接池对象、自己生成的缓存对象等等都会放到“老年区”)
4.当“老年代”放满对象的时候
“字节码执行引擎” 会开启一个线程进行Full gc(相比minor gc会慢很多)
5.当“老年代”执行Full GC 都无法清空对象,并且已经放满的时候
此时就会OOM了
此文中材料均为学习视频中摘抄的资料,侵删。
今天就先到这。下次看情况选择学习调优内容或者其他的知识点了