JVM系列-JVM调优
依赖JDK8,内容整理自:
GC日志格式
图片引用自 Jvm 系列(八):Jvm 知识点总览
Young GC日志:
Full GC日志:
JVM调优命令
jps
命令格式:jps [options] [hostid]
option参数
-l
: 输出主类全名或jar路径-q
: 只输出LVMID-m
: 输出JVM启动时传递给main()的参数-v
: 输出JVM启动时显示指定的JVM参数
[option]、[hostid]参数也可以不写
示例
1 | $ jps -l -m |
jstat
命令格式jstat [option] LVMID [interval] [count]
参数
- [option] : 操作参数
- LVMID : 本地虚拟机进程ID
- [interval] : 连续输出的时间间隔
- [count] : 连续输出的次数
option 参数详解
-class
监视类装载、卸载数量、总空间以及耗费的时间
1 | $ jstat -class 11589 |
- Loaded : 加载class的数量
- Bytes : class字节大小
- Unloaded : 未加载class的数量
- Bytes : 未加载class的字节大小
- Time : 加载时间
-compiler
输出JIT编译过的方法数量耗时等
1 | $ jstat -compiler 1262 |
- Compiled : 编译数量
- Failed : 编译失败数量
- Invalid : 无效数量
- Time : 编译耗时
- FailedType : 失败类型
- FailedMethod : 失败方法的全限定名
-gc
垃圾回收堆的行为统计,常用命令
1 | $ jstat -gc 1262 |
C即Capacity 总容量,U即Used 已使用的容量
S0C : survivor0区的总容量
S1C : survivor1区的总容量
S0U : survivor0区已使用的容量
S1U : survivor1区已使用的容量
EC : Eden区的总容量
EU : Eden区已使用的容量
OC : Old区的总容量
OU : Old区已使用的容量
MC : Metacspace元空间容量
MU : Metacspace元空间使用的容量
CCSC : 压缩类空间容量
CCSU : 压缩类空间已使用容量
YGC : 新生代垃圾回收次数
YGCT : 新生代垃圾回收时间
FGC : 老年代垃圾回收次数
FGCT : 老年代垃圾回收时间
GCT : 垃圾回收总消耗时间
-gccapacity
同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
1 | $ jstat -gccapacity 1262 |
- NGCMN : 新生代占用的最小空间
- NGCMX : 新生代占用的最大空间
- NGC : 当前新生代容量
- EC : 当前新生代 Eden区容量
- OGCMN : 老年代占用的最小空间
- OGCMX : 老年代占用的最大空间
- OGC:当前年老代的容量 (KB)
- OC:当前年老代的空间 (KB)
- MCMN : metaspace元空间占用的最小空间
- MCMX : metaspace元空间占用的最大空间
- MC : 当前metaspace元空间的容量
- CCSMN : Compressed class space占用的最小空间
- CCSMX : Compressed class space占用的最大空间
- CCSC : Compressed class space的容量
-gcutil
同-gc,不过输出的是已使用空间占总空间的百分比
1 | $ jstat -gcutil 28920 |
-gccause
垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
1 | $ jstat -gccause 28920 |
- LGCC:最近垃圾回收的原因
- GCC:当前垃圾回收的原因
-gcnew
统计新生代的行为
1 | $ jstat -gcnew 28920 |
- TT:Tenuring threshold(提升阈值,晋升到老年代所需年龄)
- MTT:最大的tenuring threshold
- DSS:survivor区域大小 (KB)
-gcnewcapacity
新生代与其相应的内存空间的统计
1 | $ jstat -gcnewcapacity 28920 |
- NGC:当前年轻代的容量 (KB)
- S0CMX:最大的S0空间 (KB)
- S0C:当前S0空间 (KB)
- ECMX:最大eden空间 (KB)
- EC:当前eden空间 (KB)
-gcold
统计旧生代的行为
1 | $ jstat -gcold 28920 |
-gcoldcapacity
统计旧生代的大小和空间
1 | $ jstat -gcoldcapacity 28920 |
-gcmetacapacity
metaspace元空间行为统计
1 | $ jstat -gcmetacapacity 3491 |
-printcompilation
hotspot编译方法统计
1 | $ jstat -printcompilation 28920 |
- Compiled:被执行的编译任务的数量
- Size:方法字节码的字节数
- Type:编译类型
- Method:编译方法的类名和方法名。类名使用”/” 代替 “.” 作为空间分隔符. 方法名是给出类的方法名. 格式是一致于HotSpot - XX:+PrintComplation 选项
jmap
jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。 jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等
命令格式jmap [option] LVMID
option参数
-dump
: 生成堆转储快照-finalizerinfo
: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象-heap
: 显示Java堆详细信息-histo
: 显示堆中对象的统计信息-permstat
: to print permanent generation statistics-F
: 当-dump没有响应时,强制生成dump快照
jhat
jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析
命令格式jhat [dumpfile]
参数
-stack false|true
关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.>-refs false|true
关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。>-port port-number
设置 jhat HTTP server 的端口号. 默认值 7000.>-exclude exclude-file
指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。>-baseline exclude-file
指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用.>-debug int
设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.>-version
启动后只显示版本信息就退出>-J< flag >
因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx
jstack
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
命令格式jstack [option] LVMID
option参数
-F
: 当正常输出请求不被响应时,强制输出线程堆栈-l
: 除堆栈外,显示关于锁的附加信息-m
: 如果调用到本地方法的话,可以显示C/C++的堆栈
jinfo
jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令
命令格式jinfo [option] [args] LVMID
option参数
-flag
: 输出指定args参数的值-flags
: 不需要args参数,输出所有JVM参数的值-sysprops
: 输出系统属性,等同于System.getProperties()
JVM调优配置参数
堆配置
-Xms
: 设置堆的最小空间大小-Xmx
: 设置堆的最大空间大小-XX:NewSize=n
:设置年轻代大小-XX:NewRatio=n
:设置年轻代和年老代的比值。如:为3表示年轻代和年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:SurvivorRatio=n
:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如3表示Eden: 3 Survivor:2,一个Survivor区占整个年轻代的1/5-XX:MaxPermSize=n
:设置持久代大小
收集器设置
-XX:+UseSerialGC
:设置串行收集器-XX:+UseParallelGC
:设置并行收集器-XX:+UseParalledlOldGC
:设置并行年老代收集器-XX:+UseConcMarkSweepGC
:设置并发收集器
并行收集器设置
-XX:ParallelGCThreads=n
:设置并行收集器收集时使用的CPU数。并行收集线程数-XX:MaxGCPauseMillis=n
:设置并行收集最大的暂停时间(如果到这个时间了,垃圾回收器依然没有回收完,也会停止回收)-XX:GCTimeRatio=n
:设置垃圾回收时间占程序运行时间的百分比。公式为:1/(1+n)-XX:+CMSIncrementalMode
:设置为增量模式。适用于单CPU情况-XX:ParallelGCThreads=n
:设置并发收集器年轻代手机方式为并行收集时,使用的CPU数。并行收集线程数
垃圾回收统计信息配置
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
JVM调优案例
参考链接: