叨逼叨
自己之前也看过一些关于jvm的书籍,知道jvm的内存分几个区域、一个对象从创建到销毁在这个几个区域是怎么扭转的,类加载机制是怎么样的、知道几种回收算法、也大概清楚常见垃圾回收器的基本执行过程,好像常见的oom、fullgc排查工具和步骤也清楚,应付一般的面试的话基本也ok
但是,当在工作中实际遇见几次fullgc问题的时候,反应还是很钝,理论概念还是太理论了,没很好的结合实践,不能非常快速的处理和定位根因,要知道发生线上问题的时候,处理速度至关重要; 你需要根据手头上的工具、grafana的jvm图表、告警内容、gc日志还要结合下系统qps等指标综合快速的判断分析
而fullgc不像别的日常故障一样常见,经验和熟练度自然也就没那么容易积累,所以就抓住这几次fullgc问题定位的机会回顾和演练多次排查过程,一边思考如果当时自己不是负责这个服务的、不清楚业务逻辑(也就是不清楚是否可能有周期/突发的流量等)、如果当时没有在grafana建立好jvm状态图表可以方便分析... 又得怎么去处理?现场应该怎么紧急处理、时候又如何定位根因?
后面又发现了个不错的专栏(末尾的图,强烈推荐),通过实际案例结合理论讲解,在学习的过程中跟着思考、做实验,解决了上面的疑问,也有对问题分析的基本姿势, 实操能力也得到了提升
期间,积累了一些笔记,整理到博客一方面方便分享,另一方面自己的理解和实验可能不一定对,希望交流交流
笔记
- 总结脑图
- 类加载的几个阶段
- jvm内存区域和对象分配过程
- 内存分配策略:minor gc前后的几种特殊情况
- 为什么老年代gc比年轻代的gc久
- 如何设置高并发系统的jvm堆内存大小
- 永久代、栈内存大小怎么设置
- 实验: 动态对象年龄判定
- 实验: survivor放不下的对象进入老年代
- 实验:老年代空闲空间放不下minorgc晋升的对象发生fullgc
- 垃圾回收的整个过程
- 空间分配担保
- 老年代回收器cms
- 案例分析:数据计算系统频发fullgc
- 面试题: parnew+cms 如何保证只做 ygc
- 什么时候会触发老年代gc
- 频繁发生fullgc的原因和定位思路
- 优化年轻代参数的分析思路
- 优化老年代参数的分析思路
- G1(Garbage First)
- 使用工具jstat和jmap
- jvm优化规范
- jvm配置模板(伪命题,但是必要)
- 分析系统gc是否健康的大概思路
- 可能出现OOM的区域和情况分析
- 实验: metaspace区域OOM