目录

  • 一、前言
  • 二、关键工具
    • 2.1 jps 显示所有JAVA进程信息
      • 1. 参数信息
      • 2. 常用命令
    • 2.2 jinfo 查看虚拟机配置参数信息
      • 1. 查看虚拟机参数 jinfo -flags pid
      • 2. 查看虚拟机指定参数 jinfo -flag 具体参数 pid
      • 3. 查看环境变量 jinfo -sysprops pid
      • 4. 参数列表
    • 2.3 jstack
      • 1. 能排查哪些问题
      • 2. 参数信息
      • 3. 分析实战
    • 2.4 jmap
      • 1. 参数信息
      • 2. 常用命令
    • 2.5 jstat
      • 1. 参数信息
      • 2. 常用命令
    • 2.6 jconsole
      • 1. 配置方法
      • 2. 各种参数含义
  • 三、常见问题以及解决方法
    • 3.1 CPU占用过高
    • 3.2 无响应/死锁
    • 3.2 频繁GC/内存溢出
    • 3.4 无任何操作下堆内存占用逐渐升高
  • 四、总结
  • 参考

一、前言

​ JDK是软件开发工具包,提供了许多工具用于编译、运行、监控、分析,放置在JDK安装目录下的bin目录中。下图是Linux上JDK8提供工具。

​ 大致介绍

工具名称 描述
appletviewer.exe 用于运行并浏览applet小程序。
apt.exe 注解处理工具(Annotation Processing Tool),主要用于注解处理。
extcheck.exe 扩展检测工具,主要用于检测指定jar文件与当前已安装的Java SDK扩展之间是否存在版本冲突。
idlj.exe IDL转Java编译器(IDL-to-Java Compiler),用于为指定的IDL文件生成Java绑定。IDL意即接口定义语言(Interface Definition Language)。
jabswitch.exe Java访问桥开关(Java Access Bridge switch),用于启用/禁用Java访问桥。Java访问桥内置于Java 7 Update 6及以上版本,主要为Windows系统平台提供一套访问Java应用的API。
jar.exe jar文件管理工具,主要用于打包压缩、解压jar文件。
jarsigner.exe jar密匙签名工具。
java.exe Java运行工具,用于运行.class字节码文件或.jar文件。
javac.exe Java编译工具(Java Compiler),用于编译Java源代码文件。
javadoc.exe Java文档工具,主要用于根据Java源代码中的注释信息生成HTML格式的API帮助文档。
javafxpackager.exe JavaFX包装器,用于执行与封装或签名JavaFX应用有关的任务。
javah.exe Java头文件工具,用于根据Java类生成C/C++头文件和源文件(主要用于JNI开发领域)。
javap.exe Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件。
java-rmi.exe Java远程方法调用(Java Remote Method Invocation)工具,主要用于在客户机上调用远程服务器上的对象。
javaw.exe Java运行工具,用于运行.class字节码文件或.jar文件,但不会显示控制台输出信息,适用于运行图形化程序。
javaws.exe Java Web Start,使您可以从Web下载和运行Java应用程序,下载、安装、运行、更新Java应用程序都非常简单方便。
jcmd.exe Java 命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。
jconsole.exe 图形化用户界面的监测工具,主要用于监测并显示运行于Java平台上的应用程序的性能和资源占用等信息。
jdb.exe Java调试工具(Java Debugger),主要用于对Java应用进行断点调试。
jhat.exe Java堆分析工具(Java Heap Analysis Tool),用于分析Java堆内存中的对象信息。
jinfo.exe Java配置信息工具(Java Configuration Information),用于打印指定Java进程、核心文件或远程调试服务器的配置信息。
jmap.exe Java内存映射工具(Java Memory Map),主要用于打印指定Java进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节。
jmc.exe Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。
jps.exe JVM进程状态工具(JVM Process Status Tool),用于显示目标系统上的HotSpot JVM的Java进程信息。
jrunscript.exe Java命令行脚本外壳工具(command line script shell),主要用于解释执行javascript、groovy、ruby等脚本语言。
jsadebugd.exe Java可用性代理调试守护进程(Java Serviceability Agent Debug Daemon),主要用于附加到指定的Java进程、核心文件,或充当一个调试服务器。
jstack.exe Java堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。
jstat.exe JVM统计监测工具(JVM Statistics Monitoring Tool),主要用于监测并显示JVM的性能统计信息。
jstatd.exe jstatd(VM jstatd Daemon)工具是一个RMI服务器应用,用于监测HotSpot JVM的创建和终止,并提供一个接口,允许远程监测工具附加到运行于本地主机的JVM上。
jvisualvm.exe JVM监测、故障排除、分析工具,主要以图形化界面的方式提供运行于指定虚拟机的Java应用程序的详细信息。
keytool.exe 密钥和证书管理工具,主要用于密钥和证书的创建、修改、删除等。
kinit.exe 主要用于获取或缓存Kerberos协议的票据授权票据。
klist.exe 允许用户查看本地凭据缓存和密钥表中的条目(用于Kerberos协议)。
ktab.exe Kerberos密钥表管理工具,允许用户管理存储于本地密钥表中的主要名称和服务密钥。
native2ascii.exe 本地编码到ASCII编码的转换器(Native-to-ASCII Converter),用于"任意受支持的字符编码"和与之对应的"ASCII编码和(或)Unicode转义"之间的相互转换。
orbd.exe 对象请求代理守护进程(Object Request Broker Daemon),它使客户端能够透明地定位和调用位于CORBA环境的服务器上的持久对象。
pack200.exe JAR文件打包压缩工具,它可以利用Java类特有的结构,对普通JAR文件进行高效压缩,以便于能够更快地进行网络传输。
packager.exe 这是微软提供的对象包装程序,用于对象安装包。
policytool.exe 策略工具,用于管理用户策略文件(.java.policy)。
rmic.exe Java RMI 编译器,为使用JRMP或IIOP协议的远程对象生成stub、skeleton、和tie类,也用于生成OMG IDL。
rmid.exe Java RMI 激活系统守护进程,rmid启动激活系统守护进程,允许在虚拟机中注册或激活对象。
rmiregistry.exe Java 远程对象注册表,用于在当前主机的指定端口上创建并启动一个远程对象注册表。
schemagen.exe XML schema生成器,用于生成XML schema文件。
serialver.exe 序列版本命令,用于生成并返回serialVersionUID。
servertool.exe Java IDL 服务器工具,用于注册、取消注册、启动和终止持久化的服务器。
tnameserv.exe Java IDL瞬时命名服务。
unpack200.exe JAR文件解压工具,将一个由pack200打包的文件解压提取为JAR文件。
wsgen.exe XML Web Service 2.0的Java API,生成用于JAX-WS Web Service的JAX-WS便携式产物。
wsimport.exe XML Web Service 2.0的Java API,主要用于根据服务端发布的wsdl文件生成客户端存根及框架
xjc.exe 主要用于根据XML schema文件生成对应的Java类。

二、关键工具

2.1 jps 显示所有JAVA进程信息

1. 参数信息

若服务的启动命令使用了jar包的相对路径,仅使用jps会查看不到服务全名,只显示jar。加-l可解决该问题。

  • -q 只输出PID。
  • -m 输出传递给 main 方法的参数。对于嵌入式 JVM,输出可能为空。
  • -l 输出应用程序主类的完整包名或应用程序 JAR 文件的完整路径名。
  • -v 输出传递给 JVM 的参数。
  • -V 通过 flags 文件(.hotspotrc 文件或 -XX:Flags=< filename > 参数指定的文件)输出传递给 JVM 的参数。本参数不常用。
  • -Joption 将选项传递给jps调用的java启动器。例如,-J-Xms48m是将启动内存设置为 48 兆字节。

2. 常用命令

// 显示所有Java进程信息
jps -lmv
// 输出 【pid,应用名,传给main方法的参数,传给jvm的参数】
22693 app.jar --spring.profiles.active=prod,sqlfx -Xms2048m

2.2 jinfo 查看虚拟机配置参数信息

环境变量和JVM参数都可以用jps看。其它的功能使用场景不多。

1. 查看虚拟机参数 jinfo -flags pid

jinfo -flags pid

输出结果解释:

  • Non-default:虚拟机默认设置的参数
  • Command line:用户指定的参数

2. 查看虚拟机指定参数 jinfo -flag 具体参数 pid

[root@manager2 bin]# jinfo -flag MaxHeapSize 7996
-XX:MaxHeapSize=2147483648

3. 查看环境变量 jinfo -sysprops pid

jinfo -sysprops 7996

4. 参数列表

jinfo [options]

options 含义
-flag name 输出对应名称的参数
-flag [+|-]name 开启或者关闭对应名称的参数
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性

2.3 jstack

用于生成虚拟机当前时刻的线程快照,包括当前虚拟机内每条线程正在执行的方法堆栈的集合。

1. 能排查哪些问题

在如下三种情况生成线程dump

  • 本地虚拟机
  • 远端虚拟机
  • 崩溃产生的core文件

定位线程长时间停顿的原因。通常是

  • 线程间死锁
  • 死循环、长循环造成的CPU占用过高
  • 请求外部资源长时间等待

2. 参数信息

命令格式:

  • 查看本地虚拟机 jstack [option] < pid >
  • 查看远端虚拟机 jstack [option] server_id@remote server IP or hostname
  • 查看崩溃产生的core文件 jstack [option] executable core

option代表的参数:

  • -F:线程挂起时(hung)使用-l请求不被响应,可以强制输出线程堆栈
  • -l:除了堆栈信息外(默认展示synchronized锁的信息),显示锁的附加信息,例如ownable synchronizers(使用AbstractOwnableSynchronizer实现的锁信息)
  • -m:输出java以及C/C++的堆栈信息

3. 分析实战

这篇文章讲的挺多。 jstack工具介绍,举例具体分析过程

大概需要了解的知识点:

  • Java线程状态
  • Synchromized锁的Monitor及相关状态
  • 调用修饰:locked / waiting to lock / waiting on / parking to wait for的含义

2.4 jmap

jmap是一个多功能命令,可以查看堆内对象统计信息(每种类实例的大小和数量)、堆的摘要信息(堆配置、GC算法、各区域使用情况)、finalizer队列等

1. 参数信息

option:

  • no option: 进程的内存映像信息
  • heap: 堆的摘要,包括GC算法、堆配置信息、各内存使用情况
  • histo[:live]: 堆中对象的统计信息
  • clstats: 打印类加载器信息
  • finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • dump:: 生成堆转储快照
  • F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.

2. 常用命令

  1. 命令:jmap -head pid 显示堆的摘要信息
[root@manager2 bin]# jmap -heap 31137
Attaching to process ID 31137, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.342-b07using thread-local object allocation.
Parallel GC with 13 thread(s)Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 16848519168 (16068.0MB)NewSize                  = 351272960 (335.0MB)MaxNewSize               = 5616173056 (5356.0MB)OldSize                  = 703594496 (671.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 4565499904 (4354.0MB)used     = 4519485880 (4310.117607116699MB)free     = 46014024 (43.88239288330078MB)98.99213613037894% used
From Space:capacity = 61341696 (58.5MB)used     = 25460768 (24.281280517578125MB)free     = 35880928 (34.218719482421875MB)41.50646242321047% used
To Space:capacity = 58195968 (55.5MB)used     = 0 (0.0MB)free     = 58195968 (55.5MB)0.0% used
PS Old Generationcapacity = 415760384 (396.5MB)used     = 95344240 (90.92735290527344MB)free     = 320416144 (305.57264709472656MB)22.932497580144624% used31043 interned Strings occupying 2942680 bytes.
  1. 命令:jmap -histo:live pid 显示堆中各种对象的数量和大小
[root@manager2 bin]# jmap -histo:live 31137num     #instances         #bytes  class name
----------------------------------------------1:        278063       17065360  [C2:        276958        6646992  java.lang.String3:        117619        3763808  java.util.HashMap$Node4:         82454        2638528  java.util.concurrent.ConcurrentHashMap$Node5:         29908        2392640  net.sf.ehcache.Element6:         10918        2127168  [B7:         23817        2095896  java.lang.reflect.Method8:         23527        2005488  [Ljava.util.HashMap$Node;9:         10843        1738832  [I10:         14079        1558632  java.lang.Class11:         22581        1293976  [Ljava.lang.Object;12:         29908        1196320  net.sf.ehcache.store.chm.SelectableConcurrentHashMap$HashEntry
  1. 命令:jmap -finalizerinfo pid 查看等待终结的对象
[root@APP]# jmap -finalizerinfo 6398
Attaching to process ID 6398, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.342-b07
Number of objects pending for finalization: 0

2.5 jstat

能够对Java应用程序的资源和性能进行实时的命令行的监控。如GC分析、内存统计等

1. 参数信息

查看帮助信息 , 主要的使用方式为: jstat -<option> PID [间隔时间/毫秒] [查询次数]

查看options主要参数:

[root@manager2 bin]#  jstat -options
-class          (类加载统计)
-compiler       (编译统计)
-gc             (垃圾回收统计)
-gccapacity     (堆内存统计)
-gccause        (最近一次GC统计和原因)
-gcmetacapacity (JDK8 下 元数据空间统计)
-gcnew          (新生代垃圾回收统计)
-gcnewcapacity  (新生代内存统计)
-gcold          (老年代垃圾回收统计)
-gcoldcapacity  (老年代内存统计)
-gcutil         (总结垃圾回收统计)
-printcompilation(JVM编译方法统计)

2. 常用命令

  1. 命令: jstat -gc pid 时间间隔(毫秒) 次数 查看gc信息,单位都是字节
    每秒查询1次,共10次。可见新创建的对象都放到Eden区。
[root@manager2 bin]# jstat -gc 31137 1000 10S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
47616.0 53760.0  0.0    0.0   5367808.0 1162424.6  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1162424.6  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1180319.4  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1194274.7  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1220646.5  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1240688.0  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1253570.8  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1260728.0  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1285790.5  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138
47616.0 53760.0  0.0    0.0   5367808.0 1289369.0  571904.0   59226.4   78800.0 74311.4 9728.0 8823.2     12    0.628   4      0.511    1.138

每列含义:

显示列名 具体描述
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
EU 年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC Old代的容量 (字节)
OU Old代目前已使用空间 (字节)
MC 元空间的容量 (字节)
MU 元空间目前已使用空间 (字节)
CCSC 压缩类空间大小
CCSU 压缩类空间使用大小
YGC 年轻代垃圾回收次数
YGCT 年轻代垃圾回收消耗时间
FGC 老年代垃圾回收次数
FGCT 老年代垃圾回收消耗时间
GCT 垃圾回收消耗总时间
  1. 命令:jstat -gcutil pid 时间间隔(毫秒) 次数 总结gc信息,单位是百分比
    每秒1次,查询15次。可见发生一次young GC
[root@manager2  APP]# jstat -gcutil 17180 1000 15S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT0.00  38.24  30.00  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  36.00  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  44.00  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  55.99  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  61.99  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  65.99  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  75.99  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  87.99  69.41  94.18  91.72     57    4.739     4    1.501    6.2400.00  38.24  97.99  69.41  94.18  91.72     57    4.739     4    1.501    6.24046.98   0.00   6.00  69.41  94.18  91.72     58    4.755     4    1.501    6.25646.98   0.00  16.00  69.41  94.18  91.72     58    4.755     4    1.501    6.25646.98   0.00  24.00  69.41  94.18  91.72     58    4.755     4    1.501    6.25646.98   0.00  34.00  69.41  94.18  91.72     58    4.755     4    1.501    6.25646.98   0.00  42.00  69.41  94.18  91.72     58    4.755     4    1.501    6.25646.98   0.00  51.99  69.41  94.18  91.72     58    4.755     4    1.501    6.256

各列含义:

显示列名 具体描述
S0 幸存1区当前使用比例
S1 幸存2区当前使用比例
E 伊甸园区使用比例
O 老年代使用比例
M 元数据区使用比例
CCS 压缩使用比例
YGC 年轻代垃圾回收次数
FGC 老年代垃圾回收次数
FGCT 老年代垃圾回收消耗时间
GCT 垃圾回收消耗总时间

2.6 jconsole

JDK自带的可视化监控工具

1. 配置方法

本地进程的监控无需配置,双击想要监控的服务即可。后续只写监控远程进程的配置方法

#mermaid-svg-TyUAiAr7JhSD3BBg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TyUAiAr7JhSD3BBg .error-icon{fill:#552222;}#mermaid-svg-TyUAiAr7JhSD3BBg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TyUAiAr7JhSD3BBg .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-TyUAiAr7JhSD3BBg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TyUAiAr7JhSD3BBg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TyUAiAr7JhSD3BBg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TyUAiAr7JhSD3BBg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TyUAiAr7JhSD3BBg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TyUAiAr7JhSD3BBg .marker.cross{stroke:#333333;}#mermaid-svg-TyUAiAr7JhSD3BBg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TyUAiAr7JhSD3BBg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TyUAiAr7JhSD3BBg .cluster-label text{fill:#333;}#mermaid-svg-TyUAiAr7JhSD3BBg .cluster-label span{color:#333;}#mermaid-svg-TyUAiAr7JhSD3BBg .label text,#mermaid-svg-TyUAiAr7JhSD3BBg span{fill:#333;color:#333;}#mermaid-svg-TyUAiAr7JhSD3BBg .node rect,#mermaid-svg-TyUAiAr7JhSD3BBg .node circle,#mermaid-svg-TyUAiAr7JhSD3BBg .node ellipse,#mermaid-svg-TyUAiAr7JhSD3BBg .node polygon,#mermaid-svg-TyUAiAr7JhSD3BBg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TyUAiAr7JhSD3BBg .node .label{text-align:center;}#mermaid-svg-TyUAiAr7JhSD3BBg .node.clickable{cursor:pointer;}#mermaid-svg-TyUAiAr7JhSD3BBg .arrowheadPath{fill:#333333;}#mermaid-svg-TyUAiAr7JhSD3BBg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TyUAiAr7JhSD3BBg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TyUAiAr7JhSD3BBg .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-TyUAiAr7JhSD3BBg .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-TyUAiAr7JhSD3BBg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TyUAiAr7JhSD3BBg .cluster text{fill:#333;}#mermaid-svg-TyUAiAr7JhSD3BBg .cluster span{color:#333;}#mermaid-svg-TyUAiAr7JhSD3BBg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TyUAiAr7JhSD3BBg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

远程监控
jconsole
service

1. 服务器JVM配置

找到服务使用Java的lib/management目录,如

# 进入对应目录
cd /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/management
# 修改文件名称
mv jmxremote.password.template jmxremote.password
# 赋权,配置文件可写
chmod +w jmxremote.password

vim命令打开文件,把controlRole和monitorRole的注释#移除,并保存文件

再次赋权

chmod 600 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/management/jmxremote.*

2. 启动jar命令修改

java -jar -Djava.rmi.server.hostname=当前服务器IP -Dcom.sun.management.jmxremote.port=指定一个未被占用的端口 -Dcom.sun.managent.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false xxx.jar

启动后查看日志正常启动即可。

3. jconsole连接

配置远程连接信息。

  • 远程进程处填启动命令配置的 【java.rmi.server.hostname】:【com.sun.management.jmxremote.port】
  • 用户名和密码填jmxremote.password文件中的monitorRole及后面的密码

可能遇到找不到主机名的问题,参考https://blog.csdn.net/cc920095705/article/details/107891424

连接后结果如图

2. 各种参数含义

见 深入了解JVM虚拟机 第二章

三、常见问题以及解决方法

3.1 CPU占用过高

  1. top -ic 发现CPU占比较高
  2. jstack -l 17180 > stack.log 导出线程堆栈信息
  3. top -Hp 17180 查看该进程的线程信息
  4. printf %x 17508 将CPU占比高的线程PID转16进制,得到4464
  5. 在文件中查找4464或者使用命令查看(grep -n -B 20 4464 stack.log),可以得知当前线程的状态和正在执行的代码的位置
[root@APP]# grep -n -A 50 4464 stack.log
507:"pool-1-thread-1" #30 prio=5 os_prio=0 tid=0x00007f50659b7800 nid=0x4464 runnable [0x00007f4ff22f4000]
508-   java.lang.Thread.State: RUNNABLE
509-    at java.net.SocketOutputStream.socketWrite0(Native Method)
510-    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
511-    at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
512-    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
513-    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
514-    - locked <0x00000006cd8c0650> (a java.io.BufferedOutputStream)
...
  • -n 显示行号
  • -A 显示当前配置位置之后的多少行

得到位置就可以到代码中定位问题。

3.2 无响应/死锁

jstack的线程堆栈信息可以提示死锁。

3.2 频繁GC/内存溢出

借助jmap命令、jstat命令可以得知对象创建情况、GC情况,从而定位问题。

服务器命令参考

jmap -histo:live 56390 > jmap.log
jstat -gc 56390 5000 20
jstat -gcutil 56390 5000 20

jar启动参数添加

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="./heapdump.hprof"

内存溢出崩溃后会在对应目录下生成heapdump.hprof文件,可以用jvisualVM分析

3.4 无任何操作下堆内存占用逐渐升高

现象1:通过jconsole监视堆内存发现占用逐渐升高,此时系统未接受任何请求且代码里无定时任务
推测:内存泄漏

现象2:通过JVisualVM对比两次堆实例,发现多了许多byte[]、ByteBuffer、SocksSocketImpl
推测:存在类似Nacos客户端轮询的请求

导出dump会导致stop the word

四、总结

常用的

  • jps 找应用进程PID
  • jstack分析死锁(jconsole可以代替)或CPU高的原因(arthas可以代替)
  • jmap分析内存泄漏的原因(jvisualVM可以代替)
  • jconsole可视化分析内存变化、GC、线程数、死锁比较方便
  • jstat 常用语分析GC信息(jconsole、arthas都容易代替)

参考

  • JDK bin目录下自带的工具介绍,讲解比较详细
  • JPS命令
  • JPS命令详解、查看其它服务器、失效原因
  • Java所有JVM参数VM Flags,罗列了各种参数
  • jstack工具介绍,强烈推荐
  • stack与Locked ownable synchronizers
  • jvm性能调优工具之jmap
  • jconsole的使用

【JDK工具】jinfo、jps、jstack、jstat、jmap、jconsole相关推荐

  1. jps,jstat,jinfo,jstack,jmap,jhat

    基础故障处理工具jps,jstat,jinfo,jstack,jmap,jhat jps:虚拟机进程状况工具 JDK的很多小工具的名字都参考了UNIX命令的命名方式,jps(JVM Process S ...

  2. JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)...

    2019独角兽企业重金招聘Python工程师标准>>> 前提概要:         JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外 ...

  3. JDK源码研究Jstack,JMap,threaddump,dumpheap的原理

    JDK最新bug和任务领取:https://bugs.openjdk.java.net/projects/JDK/issues 参加OpenJDK社区:https://bugs.openjdk.jav ...

  4. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解

    参考来自:周志明著 深入理解JAVA虚拟机 https://www.cnblogs.com/therunningfish/p/5524238.html http://www.tuicool.com/a ...

  5. 七、jdk工具之jconsole命令(Java Monitoring and Management Console)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  6. jdk工具之JvisualVM、JvisualVM之一--(visualVM介绍及性能分析示例)

    转载:https://www.cnblogs.com/duanxz/p/3713773.html 1.1 Visual VM简介 VisualVM 提供在 Java 虚拟机 (Java Virutal ...

  7. GC调优基础知识之工具篇--jdk为我们提供的命令行命令 jps,jstat,jmap,jinfo,jstat,jstack,jhat 等

    一. JDK为我们提供的工具:    在Windows中对于这些命令的支持是源自JDK -->bin下面的.exe可执行文件的支持.    在Linux中对于这些命令的支持是源自JDK --&g ...

  8. jdk命令行工具(jps+jstat+jinfo+jmap+jstack)

    jps:虚拟机进程状况工具 可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(main class,class()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID. jps命令格式: jps ...

  9. jps、jinfo、jstat、jstack、jmap、jconsole等命令简介

    2019独角兽企业重金招聘Python工程师标准>>> JDK提供了几个很实用的工具,如下: jinfo:观察运行中的java程序的运行环境参数:参数包括Java System属性和 ...

最新文章

  1. [转]bootstrap table 动态列数
  2. 谈题库系统(Samplx)项目之进展
  3. MATLAB从入门到精通-MATLAB2021版类似excel的坐标轴标签自动缩放布局
  4. 聊聊我对黑客技术的思考
  5. __declspec(dllimport)
  6. w10计算机无法打印,win10升级后惠普无法打印怎么解决_win10升级后惠普打印不了的处理办法...
  7. mysql slowlog中querytime分析_技术分享 | Slow Query Log 使用详解
  8. Redis缓存持久化:RDB持久化和AOF持久化
  9. Out of memory error : GC overhead limit exceeded
  10. python使用scipy模块from scipy.misc import imread时报错:cannot import name imread问题解决
  11. OpenCV最简JAVA版范例
  12. MP4文件中提取H264码流保存成H264文件
  13. 北京理工大学—计算机专业课程资源
  14. [数据][xml格式] 2012年统计用区划代码和城乡划分代码
  15. 计算机设备管理器驱动,设备管理器安装驱动程序的详细教程
  16. steam怎么设公用计算机,steam如何设置家庭共享?steam设置家庭共享的方法
  17. 贝茨视觉训练法 (Dr William Bates)方法
  18. 使用Scrapy模拟登陆人人网
  19. 我们无法设置移动热点_支付宝微信设置了密码,为何超市扫码枪能将钱扫走?多数人不了解...
  20. win10合并硬盘合区(win10怎样合并硬盘的两个分区)

热门文章

  1. 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
  2. ctfshow-web入门(21-28)
  3. java医院门诊预约挂号排班系统ssm
  4. php消息撤回,QQ怎么在撤回消息后面加字?QQ消息撤回修改内容
  5. Java实现建造者模式
  6. 计算机站课作文400字,关于电脑教室的作文400字
  7. Oracle数据库数据备份导出导入
  8. 系统稳定性(基于matlab求传递函数特征根)
  9. html5报餐系统源码,中学食堂报餐系统
  10. 手机上流行的各类谜语