参数分类
在多数项目中不需要进行JVM调优,在出现OOM或CPU飙高,往往是程序问题,应该想办法优化程序。
但是,在一般情况下,应该在上线前将JVM调整到最优,保证虚拟机:
- GC低停顿
- GC低频率
- 低内存占用
- 高吞吐量
调优中一般会遇到两种参数,一种是任何虚拟机版本都相同的标准参数,这些参数不需要人为调整,另一种是非标准参数,也是不稳定的参数,需要根据实际情况进行设定。
标准参数
标准参数,以 -
开头,如 -version
非标准参数
非标准参数 ,以 -X
或-XX
开头,这些参数非常多,并且需要根据不同的情况进行不同的调整。
虚拟机的调优就是在不同的情况下针对这些非标准参数进行调整。
常用参数
- -Xms 初始化堆内存的最小值
- -Xmx 初始化堆内存的最大值,一般和 Xms的值设为相同的值。
- -Xmn 初始化堆中的新生代大小
- -XX:ParallelGCThreads=8:新生代并行收集器的线程数。
- -Xloggc: /opt/xxx/logs/xxx-xxx-gc-%t.log GC日志输出文件
- -XX:+UseGCLogFileRotation
- -XX:NumberOfGCLogFiles=5
- -XX:GCLogFileSize=20M
- -XX:+PrintGCTimeStamps 打印GC耗时
- -XX:+PrintGCDetails 打印GC回收的细节
- -XX:HeapDumpPath=./java_pid
.hprof :堆内存快照的存储文件路径。文件名一般为java_ _ _ - -XX:+HeapDumpOnOutOfMemoryError 在OOM时,输出一个dump文件
常用工具
命令行工具
jps
JPS(Java Virtual Machine Process Status Tool),可以显示进行中的Java线程。
使用方式:jps [options] [hostid]
jinfo
jinfo(Java Configuration Info),实时查看和调整JVM配置参数.
使用方式: jinfo -flag <name> PID
或者 jinfo -flags PID
jstat -gc
jstat(Java Virtual Machine statistics monitoring tool),能够查看JVM的使用情况
使用方式:jstat [ generalOption | outputOptions vmid [ interval [ s|ms ] [ count ] ] ]
如: jstat -gc -h3 31736 1000 10
jstack
jstack(Java stack trace)是Java的堆栈分析工具。
两个功能:
- 针对活着的进程做本地的或远程的线程dump;
- 针对core文件做线程dump。
使用方式:jstack [ option ] pid
可将堆栈输出到指定文件中:jstack -l PID >> jstack.out
jmap
jmap(Java memory map),它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
命令:jmap pid
描述:查看进程的内存映像信息,类似 Solaris pmap 命令。
命令:jmap -heap pid
描述:显示Java堆详细信息
命令:jmap -histo:live pid
描述:显示堆中对象的统计信息
命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆转储快照dump文件。
arthas 线上排查工具
arthas 能够完成以上所有的工作,但是需要注意的是,使用jmap或jstack