GC干货
1、young gc
2、对象进入老年代时机
3、old gc
晋升担保机制
4、gc优化
a、如何设置jvm参数
估算: 系统qps 创建对象个数 请求对象总大小 每秒使用内存空间
目标:尽可能让每次youngc后存活的对象远远小于survivor区域 避免对象频繁进入老年代触发fullgc
理想状态: 系统几乎不发生fullgc。 老年代的对象比较稳定,长期使用的对象 躲过了15次younggc后晋升的对象
系统压测模拟线上并发的压力
用jstat观察gc日志
b、fullgc的表现
cpu负载高
系统无法处理请求或处理过慢
c、fullgc常见原因
系统并发过高或处理数据量大,导致youngc频繁,而且每次younggc过后存活对象太多,内存分配不合理,survivor区域过小,导致对象频繁进入到老年代,频繁触发full gc
系统一次性加载过多的数据到内存中,有很多大对象,导致频繁进入老年代,频繁触发fullgc
发生了内存泄露,大量对象无法回收,一直在老年代里,频繁触发fullgc
metaspace因为加载类过来触发fullgc
调用了System.gc()
整理一份参数模板使用
5、 内存溢出
metaspace:
a 使用默认参数 依赖了很多的外部jar 导致太小不够用
b 使用了cglib会动态生成很多类 没有控制好数量
栈:
递归的方法调用
堆:
高并发请求
内存泄漏