JVM参数及性能调优
1、JVM参数
分为标准参数和非标准参数。标准参数如:-version,-help。非标准参数有-X和-XX,其中-XX使用最多,主要用于JVM调优和Debug。
* Boolean类型,格式:-XX:[+-]<name>,+或-表示启用或禁用name属性。
如:-XX:+UseG1GC 表示启用G1垃圾收集器
* 非Boolean类型,格式:-XX<name>=<value> ,表示name属性的值是value。
如:-XX:MaxGCPauseMillis=500 表示GC停顿最大时间为500毫秒
还有一些参数简写:
—— -Xms1000等价于-XX:InitialHeapSize=1000
—— -Xmx1000等价于-XX:MaxHeapSize=1000
—— -Xss100等价于-XX:ThreadStackSize=100
查看参数可以用:java -XX:+PrintFlagsFinal -version > flags.txt,导入到文件再查看。
2、常用命令
(1)jps,查看进程
(2)jinfo,实时查看和调整JVM配置参数
* 查看:jinfo -flag name PID,查看某个Java进程的name属性的值
* 修改:jinfo -flag [+-]<name> PID 或 jinfo -flag <name>=<value> PID
只有被标记为manageable的参数可以被实时修改
(3)jstat,查看虚拟机性能统计信息
* 查看类装载信息
jstat -class PID 1000 10,查看某个Java进程的类装载信息,每1000毫秒输出一次,输出10次。
* 查看垃圾收集信息
jstat -gc PID 1000 10,查看某个Java进程的GC信息。
(4)jstack,查看线程堆栈信息
jstack PID,查看进程中线程的状态。
(5)jmap,生成堆转储快照
* jmap -heap PID,打印出堆内存相关信息
* jmap -dump:format=b,file=heap.hprof PID,dump出堆内存相关信息,对于dump出的文件,可以结合工具来分析。
在开发中,可以添加如下参数,当发生堆内存溢出的时候,会自动dump出该文件。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
3、常用工具
(1)jconsole
JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用 情况、类加载情况等。
(2)jvisualvm
可以监控本地或远程的Java进程,查看进程中的CPU、类、线程等。
(3)Arthas
alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。
(4)MAT
Java堆分析器,用于查找内存泄漏。
4、GC日志分析
要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
分析工具:
* 在线:http://gceasy.io
* GCViewer
5、Java排查性能问题的参数
①top:实时显示各个进程的CPU占用率、内存使用率等资源占用情况。
②top -Hp pid:查看具体线程的CPU占用率。
③vmstat:可以指定采样周期和次数的监测工具,可以用来查看上下文切换次数
④jstat:查看堆内存信息和GC信息。jstat -gc显示GC相关的堆信息、jstat -gcutil显示GC信息。它会打印各个元区使用量和GC次数。
⑤jstack:查看线程的堆栈信息。
⑥jmap:输出堆内存的对象信息
①通过top命令找到占用CPU最高的进程pid
②通过top -Hp pid找到进程中占用CPU过高的线程tid
③通过jstack pid | grep tid {-A 30} 得到线程堆栈信息,根据堆栈信息就可以定位到项目中的问题了。
①配置JVM启动参数-XX:HeapDumpOnOutOfMemoryError与-XX:HeapDumpPath,JVM发生OOM时就会自动生成dump日志
②使用 jmap -dump:format=b , file=D:\test\heap.hprof 6956导出dump日志(进程号:netstat -ano | find “8080” 查看当前应用程序使用的进程号。)
③可以使用JDK自带的jvisualvm导入dump快照,进行查看。