https://www.bilibili.com/video/BV1Yr4y1N7HL?p=3&spm_id_from=pageDriver
基本内存结构
堆内存结构以及调优
调优就是减少yong gc和full gc的频繁次数
以及yong gc和full gc发生时占用时间
可达性分析算法
minor gc:如何判断对象为非垃圾:从变量的引用找出所有应用的对象,为非垃圾,并将其分代年龄+1(minor gc回收整个年轻代的垃圾又称为yong gc)
1.当堆的Eden(伊甸园)第一次满了就触发minor gc,并将这些非垃圾从Eden(伊甸园)复制到Survivor0区,并将其分代年龄+1,剩余的就是垃圾,之后直接清空Eden(伊甸园)
2.下次堆的Eden(伊甸园)满了就再次触发minor gc,并将这些非垃圾从Eden(伊甸园)复制到Survivor1区,minor gc也会找出Survivor0区的非垃圾复制到Survivor1区,之后直接清空Eden(伊甸园)和Survivor0区
3.下次堆的Eden(伊甸园)满了就再次触发minor gc,并将这些非垃圾从Eden(伊甸园)复制到Survivor0区,minor gc也会找出Survivor1区的非垃圾复制到Survivor0区,之后直接清空Eden(伊甸园)和Survivor1区
4.循环上面的第二第三步骤
5.当分代年龄=15,会被放入老年代
6.当老年代满了会触发full gc,当无法回收时就OOM注意:默认的内存划分是这样的
年轻代:8:1:1
1.当Eden的所有对象都非垃圾时,s0明显不够用,直接会将多余的放入老年代
2.如果一批新的对象进入s0或者s1,这批对象的大小大于S0的百分之50也会直接放入老年代
G1垃圾收集器
频繁yong gc,但每次操作用户无感知(非常快),每次回收一小部分
对象的组成
内存监控
线上问题定位
https://www.bilibili.com/video/BV1Yr4y1N7HL?p=4&spm_id_from=pageDriver
阿里巴巴提供的JVM监控工具Arthas
输入
dashboard
可以看到线程,内存以及运行环境信息
查看异常的线程(线程8占用cpu高)
thread 8
就直接定位到那个类的那行代码
线上查看代码
jad 类的全路径