欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

*Minor gc 和 full Gc

程序员文章站 2022-03-02 22:09:02
...

minor gc 

  • 对新生代进行gc,比较频繁,因为大部分对象的生命周期都比较短,在新生代回收性能消费小;
  • 当Eden区空间不足的时候,就会触发minor gc

full gc 

  • 全堆范围的gc,默认堆空间使用达到80%的时候会触发full gc ,
  • 老年代空间不足,永久代空间不足,调system.gc(),minor 是的悲观策略,或者 jmap -dump:live 时都会触发full gc

Minor gc 过程

  • 把在Eden去和SurvivorFrom区中存活的对象复制到SurvivorTo。如果某个对象的年龄达到老年代年龄就复制到老年代( 年龄15 XX:MaxTenuringThreshold 来设置),同时把对象的年龄加1;如果survivorTo的空间不够用或者是大对象,则直接复制到老年代
  • 清空Eden和SurvivorFrom中的对象
  • 将SurvivorTo和SurvivorFrom互换,原来的SurvivorTo变成下一次Minor gc 扫描的对象

年轻代迁移到老年代的场景

  • 在Eden 或者 SurvivorFrom 中的对象的年龄达到限制,默认是15,也就是部分对象会在From和To中来回复制15次。可以通过参数-XX:MaxTenuringThreshold来控制。
  • 新建的对象 是大对象,如果老年代分配不下 就做一次major gc
  • minor gc 后,survivorTo仍放不下,就放到老年代
  • 动态年龄判断,大于等于某个年龄的对象超过survivor空间的一半,把这些对象迁移到老年代

Full Gc 怎么排查

首先full gc 频繁说明老年代快满了,首先要排查相关参数设置,确认问题原因:

  • 如果一次full gc后 剩余对象不多,说明Eden区设置的小,导致minor gc 比较多,很多生命周期短的对象进入到老年代;
  • 如果一次 full gc 后,老年代的回收率不大,说明老年代分配小了。
  • 有很多短期存活的大对象,就是程序问题

导出内存dump文件(dump时会stop the Word)

jmap -F -dump:live,file=jmap.hprof [PID] 

把dump文件下载到本地,

scp local_file remote_ip:remote_folder  

通过jdk自带的 jvisualvm 工具分析

或者用mat来分析,直接出结果可能有 see statckTrace。

 

也可以通过设置参数 -XX:+HeapDumpOnOutOfMemoryError, oom时自动dump文件,然后照旧用快照分析。

 

把full gc 和没发生 full gc 的dump文件都下载下来

 

CPU 100% 怎么排查

  • 首先 top一下 查看cup占用情况,看到占用最高的进程 PID
  • top -Hp [pid] 看一下这个进程下面的各个线程运行情况 ,找到占用CPU最高的线程id
  • 然后 jstack 查线程id 为啥会高,这里需要转16进制。
    • 如果是VM Thread,可能就是 gc线程
      • 如果是gc线程的话 jstat -gc 看一下gc的情况,如果次数过高就排查full gc 频繁原因了。
    • 死锁
      • jstack可以帮忙确认
    • 某个接口偶尔耗时较高,可以通过压测验证
相关标签: JVM