7、垃圾回收调优

  1. 查看虚拟机参数:java-XX:PrintFlagsFinal -verson|findstr“GC”
  2. 调优领域:
    1. 内存
    2. 锁竞争
    3. cpu占用
    4. io
  3. 确定目标:
    1. 低延迟还是高吞吐量,选择适合的回收器
    2. 响应时间优先:CMS、G1,ZGC
    3. 高吞吐量:PArallelGC
  4. 最快的GC是不发生GC
    1. 查看FullGC前后的内存占用,考虑下面几个问题
      • 数据是不是太多了
        1. resultSet=statement。executeQuery(“select*from 大表”)
      • 数据是不是太臃肿了
        1. 对象图
        2. 对象大小
      • 内存是否存在泄漏
        1. 软弱引用
        2. 第三方缓存实现
  5. 新生代调优(优先)
    1. 所有的new操作的内存分配非常廉价
      • TLAB thread-local allocation buffer
    2. 死亡对象的回收代价是零
    3. 大部分对象用过即死
    4. Minor GC的时间远远低于Full GC
    5. 新生代大小是越大越好吗?
      • 小的话,minorGC频繁,大的话,fullGC出现频繁,一般控制在25%-50%
      • 但是还是尽可能大的好,理想情况是新生代能容纳所有的【并发量*(请求-响应)】的数据
      • 幸存区1大到能保存【当前活跃对象+需要晋升对象】
      • 晋升阈值配置得当,让长时间存活对象尽快晋升

  1. 老年代调优
    1. CMS的老年代内存越大越好
    2. 先尝试不做调优,如果没有FullGC,否则先尝试调优新生代
    3. 观察发生FullGC时老年代内存占用,将老年代内存预设调大
  2. 案例
    1. 案例一FullGC和MinorGC频繁
      • 调整内存大小
    2. 案例2请求高峰期发生FullGC,单次暂停时间特别长(CMS)
      • 重新标记之前,进行一次新生代回收
    3. 案例3老年代充裕情况下,发生FullGC
      • 元空间内存不足

你可能感兴趣的:(jvm,java,笔记,垃圾回收调优)