# 八、性能监控与故障处理工具

  • 命令行工具:jps、jinfo、jstack、jmap、jstat、jstatd、jcmd
  • 图形化工具:jconsole、jmc、visualvm
  • 两种连接方式:JMX、jstatd

# 1. 作用

  • 对 JVM 运行期间的内部情况进行监控,比如:对 jvm 参数、CPU、内存、堆等信息的查看。
  • 辅助进行性能优化。
  • 辅助解决应用运行时的一些问题,比如:OOM、内存泄露、线程死锁、锁争用、Java 进程小号 CPU 过高。

# 2. 命令行工具

# jps

jps(JVM Process Status Tool)主要用来输出 JVM 中运行的进程状态信息,语法格式如下:

jps [options] [hostid]

Hostid 字符串的语法与 URI 的语法基本一致:

[protocal:][[//]hostname][:port][/servername]

如果不指定 hostid,默认为当前主机或服务器。

# jinfo

打印给定进程或核心文件或远程调试服务器的配置信息。语法如下:

jinfo [option] pid

# jstack

用来查看某个 Java 进程内的线程堆栈信息。语法如下:

jstack [option] pid

# jmap

用来查看堆内存使用状况。语法如下:

jmap options pid

# jstat

JVM 统计监测工具,查看各个区内存和 GC 的情况。语法如下:

jstat options pid

# jstatd

虚拟机的 jstat 守护进程,主要用于监控 JVM 的创建与终止,并提供一个接口,以允许远程监视工具附加到在本地系统上运行的 JVM。

jstatd [options]

# jcmd

JVM 诊断命令工具,将诊断命令请求发送到正在运行的 Java 虚拟机,比如可以用来导出堆、查看 Java 进程、导出线程信息、执行 GC 等。

# 3. 图形化工具

# jconsole

一个用于监视 JVM 的符合 JMX 的图形工具。它可以监视本地和远程 JVM,还可以监视和管理应用程序。

使用方式,直接在控制台输入:

jconsole

image-20210312145717342

# jmc

jmc(JDK Mission Control,Java 任务控制)客户端包括用于监视和管理 Java 应用程序的工具,而不会引入通常与这些类型的工具相关联的性能开销。

下载地址:https://www.oracle.com/java/technologies/javase/products-jmc7-downloads.html

image-20210312152835643

# visualvm

一个图形化工具,它提供有关在 Java 虚拟机中运行的基于 Java 技术的应用程序的详细信息。

Java VisualVM 提供内存和 CPU 分析,堆转储分析,内存泄露检测,访问 MBean 和垃圾回收。

image-20210312154954108

# 4. 远程连接

# JMX

可以查看:系统信息、CPU 使用情况、线程数以及手动执行 GC 等比较偏于系统级层面的信息。

配置 JMX 的支持,需要在tomcatcatalina.sh 里面添加一些设置,如下:

CATALINA_OPTS= "
-Xms800m 
-Xmx800m 
-Xmn350m 
-XX:SurvivorRatio=8 
-XX:+HeapDumpOnOutOfMemoryError
-Dcom.sun.management.jmxremote=true                     //开启 JMX
-Djava.rmi.server.hostname=192.168.0.1                  //IP
-Dcom.sun.management.jmxremote.port=6666                //端口
-Dcom.sun.management.jmxremote.ssl=false                //关掉安全认证
-Dcom.sun.managementote.ssl=false                       //关掉安全认证
-Dcom.sun.management.jmxremote.authenticate=false       //关掉权限认证
"     

# jstatd

可以提供:JVM 内存分布详细信息、垃圾回收分布图、线程详细信息,甚至可以看到牧歌对象使用内存的大小。

配置方法:

(1)自定义一个 statd.policy 文件,添加授权信息:

// 以下为 JDK13 版本,不同版本不一样
grant codebase "jrt:/jdk.jstatd"{
    permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat"{
    permission java.security.AllPermission;
};

(2)然后再 JDK_HOME/bin 下面运行 jstatd,如:

./jstatd -J-Djava.rmi.server.hostname=192.168.0.1 -J-Djava.security.policy=[statd.policy的路径] -p 1099 &

(3)用 jmc 或 visualvm 进行远程连接

上次更新: 8/27/2021, 6:31:02 PM