Jvm调优笔记

在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多
1.MinorGC 和Full GC

MinorGC 执行时间不到50ms; Minor GC 执行不频繁,约10秒一次; Full GC 执行时间不到1s; Full GC
执行频率不算频繁,不低于10分钟1次。

Minor GC触发条件:当Eden区满时,触发Minor GC。
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)元空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
(6)堆外缓冲区不足

2.fullGC之后,系统稳定情况下老年代空间占用是老年代空间的活跃数据。其他堆空间的分配,基于以下规则来进行,如果发生大量大对象new的话,比如计算或者分析,需要找到系统的阈值,不建议使用以下参数

空间 执行命令 建议扩大倍数
-Xms -Xmx 3-4倍 full Gc 后的老年代空间占用
新生代 -XX:NewSize-XX:MaxNewSize 1-1.5倍 full Gc 后的老年代空间占用
老年代 2-3倍 full Gc 后的老年代空间占用
元空间 -XX:MaxMetaspaceSize 1.2-1.5倍 full Gc 后的老年代空间占用

-XX:NewRatio=3 新生代:老年代比例=1:3,新生代占整个堆的1/4
可以不用设置-XX:NewSize-XX:MaxNewSize
-XX:SurvivorRatio=8 新生代中新生代 Eden区、ServivorFrom、ServivorTo三个区比例8:1:1
-XX:PretenureSizeThreshold=10M 大对象直接在老年代分配阈值
-XX:MaxDirectMemorySize=128m 堆外缓冲区大小

3.开启GC日志
一般以下即可

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/logs/dump/gc2.log
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

Gc日志在线分析 https://gceasy.io/
4.查看jvm各个区的详细使用情况

jmap -heap pid

5.查看哪些存活对象(手动fullGc)

jmap -histo:live pid

6.内存溢出自动记录当前dump文件

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/dump

手动dump下当前快照(该命令不会手动触发full Gc)

jmap -dump:format=b,file=文件名.phrof pid
jmap -dump:format=b,file=文件名.dump pid

JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意

7.jstat命令详解

  1. jstat -gc pid

         可以显示gc的信息,查看gc的次数,及时间。
         其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
    

    2.jstat -gccapacity pid

         可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
         如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
         PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
         其他的可以根据这个类推, OC是old内纯的占用量。
    

    3.jstat -gcutil pid

         统计gc信息统计。
    

    4.jstat -gcnew pid

        年轻代对象的信息。
    

    5.jstat -gcnewcapacity pid

        年轻代对象的信息及其占用量。
    

    6.jstat -gcold pid

       old代对象的信息。
    

    7.stat -gcoldcapacity pid

       old代对象的信息及其占用量。
    

    8.jstat -gcpermcapacity pid

       perm对象的信息及其占用量。
    

    9.jstat -class pid

       显示加载class的数量,及所占空间等信息。
    

    10.jstat -compiler pid

       显示VM实时编译的数量等信息。
    

    11.stat -printcompilation pid

       当前VM执行的信息。
     一些术语的中文解释:
      S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
      S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
      S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
      S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
        EC:年轻代中Eden(伊甸园)的容量 (字节)
        EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
        OC:Old代的容量 (字节)
        OU:Old代目前已使用空间 (字节)
        PC:Perm(持久代)的容量 (字节)
        PU:Perm(持久代)目前已使用空间 (字节)
      YGC:从应用程序启动到采样时年轻代中gc次数
    YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
      FGC:从应用程序启动到采样时old代(全gc)gc次数
    FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
      GCT:从应用程序启动到采样时gc用的总时间(s)
    

    NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

    NGCMX:年轻代(young)的最大容量 (字节)

     NGC:年轻代(young)中当前的容量 (字节)
    

    OGCMN:old代中初始化(最小)的大小 (字节)

    OGCMX:old代的最大容量 (字节)

    OGC:old代当前新生成的容量 (字节)
    

    PGCMN:perm代中初始化(最小)的大小 (字节)

    PGCMX:perm代的最大容量 (字节)

    PGC:perm代当前新生成的容量 (字节)
    
       S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
    
      S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
    
        E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
    
        O:old代已使用的占当前容量百分比
    
        P:perm代已使用的占当前容量百分比
    

S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

   DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
      TT: 持有次数限制
   MTT : 最大持有次数限制

你可能感兴趣的:(Jvm调优笔记)