JVM - 调优工具手册
本文作为手册,在性能调优时可参考手册进行相应的调优参数配置
# 常用命令
# 列出当前运行的Java进程
$ jps -l
# 列出指定Java进程的堆内存信息 (23495代表指定的Java进程ID)
$ jmap -heap 23495
# 导出堆内存信息 (E:\output\jmap.bin代表输出的文件路径,23495代表指定的Java进程ID)
$ jmap -dump:format=b,file=E:\output\jmap.bin 23495
# 列出指定Java进程中存活的对象信息 (23495代表指定的Java进程ID,head -20 代表显示前20行,Windows中不支持head)
$ jmap -histo:live 23495 | head -20
# 每隔指定时间输出gc信息 (23495代表指定的Java进程ID, 5000代表每个5s刷新一次输出)
$ jstat -gc 23495 5000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 常用命令详解
# jinfo
查看正在运行的Java应用程序的扩展参数
# 查看jvm的参数
jinfo -flags <pid>
# 查看java系统参数
jinfo -sysprops <pid>
1
2
3
4
5
2
3
4
5
# jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
注意:使用的jdk版本是jdk8.
# 类加载统计
jstat -class <pid>
1
2
2
# 常用收集器组合方式
组合方式 | 类型 | 适用情形 |
---|---|---|
Serial + Serial Old | 都串行 | 单CPU(或CPU较少)、小型客户端 |
ParNew + Serial Old | 新生代并行 + 老年代串行 | 资源倾向新生代(响应快的web服务) |
Parallel Scavenge + Serial Old | 新生代并行(高吞吐) + 老年代串行 | 资源倾向新生代(吞吐量高的web服务) |
Parallel Scavenge + Parallel Old | Java8默认,都并行(高吞吐) | 多CPU、吞吐优先(后台处理、科学计算) |
ParNew + CMS | 新生代并行 + 老年代并发 | 多CPU、响应优先(web服务、实时计算) |
G1(ParNew + CMS的增强) | 并发 + 并行 |
# 堆栈设置
GC参数 | 参数含义 |
---|---|
-Xss | 每个线程的栈大小 |
-Xms | 初始堆大小,默认物理内存的1/64 |
-Xmx | 最大堆大小,默认物理内存的1/4 |
-Xmn | 新生代大小 |
-XX:NewSize | 设置新生代初始大小 |
-XX:NewRatio | 默认2表示新生代占年老代的1/2,占整个堆内存的1/3。 |
-XX:SurvivorRatio | 默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。 |
-XX:MaxMetaspaceSize | 设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展。 |
# 垃圾回收统计信息
GC参数 |
---|
-XX:+PrintGC |
-XX:+PrintGCDetails |
-XX:+PrintGCTimeStamps |
-Xloggc:filename |
# 收集器设置
GC参数 | 参数含义 |
---|---|
-XX:+UseSerialGC | 设置串行收集器 |
-XX:+UseParallelGC | 设置并行收集器 |
-XX:+UseParallelOldGC | 老年代使用并行回收收集器 |
-XX:+UseParNewGC | 在新生代使用并行收集器 |
-XX:+UseParalledlOldGC | 设置并行老年代收集器 |
-XX:+UseConcMarkSweepGC | 设置CMS并发收集器 |
-XX:+UseG1GC | 设置G1收集器 |
-XX:ParallelGCThreads | 设置用于垃圾回收的线程数 |
# 并行收集器设置
GC参数 | 参数含义 |
---|---|
-XX:ParallelGCThreads | 设置并行收集器收集时使用的CPU数。并行收集线程数。 |
-XX:MaxGCPauseMillis | 设置并行收集最大暂停时间 |
-XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) |
# CMS收集器设置
GC参数 | 参数含义 |
---|---|
-XX:+UseConcMarkSweepGC | 设置CMS并发收集器 |
-XX:+CMSIncrementalMode | 设置为增量模式。适用于单CPU情况。 |
-XX:ParallelGCThreads | 设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。 |
-XX:CMSFullGCsBeforeCompaction | 设定进行多少次CMS垃圾回收后,进行一次内存压缩 |
-XX:+CMSClassUnloadingEnabled | 允许对类元数据进行回收 |
-XX:UseCMSInitiatingOccupancyOnly | 表示只在到达阀值的时候,才进行CMS回收 |
-XX:+CMSIncrementalMode | 设置为增量模式。适用于单CPU情况 |
-XX:ParallelCMSThreads | 设定CMS的线程数量 |
-XX:CMSInitiatingOccupancyFraction | 设置CMS收集器在老年代空间被使用多少后触发 |
-XX:+UseCMSCompactAtFullCollection | 设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理 |
# G1收集器设置
GC参数 | 参数含义 |
---|---|
-XX:+UseG1GC | 使用G1收集器 |
-XX:ParallelGCThreads | 指定GC工作的线程数量 |
-XX:G1HeapRegionSize | 指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区 |
-XX:GCTimeRatio | 吞吐量大小,0-100的整数(默认9),值为n则系统将花费不超过1/(1+n)的时间用于垃圾收集 |
-XX:MaxGCPauseMillis | 目标暂停时间(默认200ms) |
-XX:G1NewSizePercent | 新生代内存初始空间(默认整堆5%) |
-XX:G1MaxNewSizePercent | 新生代内存最大空间 |
-XX:TargetSurvivorRatio | Survivor填充容量(默认50%) |
-XX:MaxTenuringThreshold | 最大任期阈值(默认15) |
-XX:InitiatingHeapOccupancyPercen | 老年代占用空间超过整堆比IHOP阈值(默认45%),超过则执行混合收集 |
-XX:G1HeapWastePercent | 堆废物百分比(默认5%) |
-XX:G1MixedGCCountTarget | 参数混合周期的最大总次数(默认8) |
# GC日志分析
[GC [PSYoungGen: 8192K->1000K(9216K)] 16004K->14604K(29696K), 0.0317424 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
[GC [PSYoungGen: 9192K->1016K(9216K)] 22796K->20780K(29696K), 0.0314567 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
[Full GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20435K->20435K(20480K)] 28627K->28627K(29696K), [Metaspace: 8469K->8469K(1056768K)], 0.1307495 secs] [Times: user=0.50 sys=0.00, real=0.13 secs]
[Full GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20437K->20437K(20480K)] 28629K->28629K(29696K), [Metaspace: 8469K->8469K(1056768K)], 0.1240311 secs] [Times: user=0.42 sys=0.00, real=0.12 secs]
1
2
3
4
2
3
4
# 常见异常
- StackOverflowError:(栈溢出)
- OutOfMemoryError: Java heap space(堆空间不足)
- OutOfMemoryError: GC overhead limit exceeded (GC花费的时间超过 98%, 并且GC回收的内存少于 2%)
上次更新: 2020/08/05, 09:08:00