首页 > 技术文章 > JVM参数及性能调优

jing-yi 2020-04-22 16:57 原文

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:输出堆内存的对象信息

  简单案例:
(1)CPU 100%处理过程:

  ①通过top命令找到占用CPU最高的进程pid

  ②通过top -Hp pid找到进程中占用CPU过高的线程tid

  ③通过jstack pid | grep tid {-A 30} 得到线程堆栈信息,根据堆栈信息就可以定位到项目中的问题了。

(2)排查OOM内存溢出:

  ①配置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快照,进行查看。

推荐阅读