# 八、性能监控与故障处理工具
- 命令行工具: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
# jmc
jmc(JDK Mission Control,Java 任务控制)客户端包括用于监视和管理 Java 应用程序的工具,而不会引入通常与这些类型的工具相关联的性能开销。
下载地址:https://www.oracle.com/java/technologies/javase/products-jmc7-downloads.html
# visualvm
一个图形化工具,它提供有关在 Java 虚拟机中运行的基于 Java 技术的应用程序的详细信息。
Java VisualVM 提供内存和 CPU 分析,堆转储分析,内存泄露检测,访问 MBean 和垃圾回收。
# 4. 远程连接
# JMX
可以查看:系统信息、CPU 使用情况、线程数以及手动执行 GC 等比较偏于系统级层面的信息。
配置 JMX 的支持,需要在tomcat
的 catalina.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 进行远程连接