文章目录
注:
内容部分来源于《深入理解Java虚拟机》第二版
使用虚拟机监控工具,可以让我们更快捷和方便的了解程序的运行情况,帮让我们解决问题、优化代码。
JDK/bin 目录下有着 Java 给我们提供的工具,用于监控JVM的运行状况。
命令行工具
jps: 虚拟机进程状况工具
jps -l
参数 | 说明 |
---|---|
-q | 只输出本地虚拟机ID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类 main 函数的参数 |
-l | 输出主类的全名,如果进程执行的是 jar 包,输出 jar 路径 |
-v | 输出虚拟机进程启动时 JVM 参数 |
jstat: 虚拟机统计信息监视工具
jstat -gc 2764 250 20
命令说明:每隔250毫秒查询一次虚拟机进程 2764 的 gc 状况,一共查询20次
jinfo: Java配置信息工具
查询全部配置信息,$LVMID表示虚拟机进程ID
jinfo $LVMID
查询BytecodeVerificationLocal参数值
jinfo -flag BytecodeVerificationLocal 29116
jmap: Java内存映像工具
jmap (Memory Map for Java) 命令用于生成堆转储快照(一般称为 heapdump 或 dump 文件),就是将当前的虚拟机信息以文件的形式保存下来。
jmap 的作用不仅仅是为了获取dump文件,它还可以查询finalize执行队列、java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
选项 | 说明 |
---|---|
-dump | 生成java堆转储快照。格式为:-dump:[live, ]format-b, file=, 其中live 子参数说明是否只输出dump 出存活的对象 |
-finalizerinfo | 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。 |
-heap | 显示Java 堆详细信息,如使用那种回收器、参数配置、分代状况等。 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-permstat | 以ClassLoader 为统计口径显示永久代内存状态 |
-F | 当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成 dump 快照。 |
因JDK 版本不同,低版本中有部分选项只在 Linux/Solaris 下可以使用
示例:
jmap -dump:format=b,file=my.bin 3500
jhat: 虚拟机堆转储快照分析工具
jhat my.bin
运行成功之后,在浏览器访问: http://localhost:7000/ 就可以看到分析结果
jstack: Java 堆栈跟踪工具
jstack 命令用于生成虚拟机当前时刻的线程快照。
选项 | 说明 |
---|---|
-F | 当正常的输出请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示 C/C++ 的堆栈 |
示例:
jstack -l 29116
可视化工具
JConsole: Java 监视与管理控制台
VisualVM:多合一故障处理工具
连接远程虚拟机
启动时指定虚拟机参数
-Dcom.sun.management.jmxremote.port=8096
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=106.14.32.244
示例:
java -Dcom.sun.management.jmxremote.port=8096 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=106.14.xxx.xxx -jar security-0.0.1-SNAPSHOT.jar
经测试,这种方式可以使用 JConsole 来连接
配合jstatd工具提供监控数据
- 在JAVA_HOME/bin目录中创建文件jstatdAllPolicy(这个文件名称可以随便起,需要与jstatd启动时指定名称相同),将以下内容拷贝到文件中,并且保证文件的权限以及用户都正确:
grant codebase"file:${java.home}/../lib/tools.jar"{ permission java.security.AllPermission; };
- 在JAVA_HOME/bin目录中,执行以下命令:
./jstatd -J-Djava.security.policy=jstatdAllPolicy -p 8600 -J-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
经过测试,这种方式可以使用 jvisualvm 来连接:
参考:https://blog.csdn.net/chwshuang/article/details/44202561