工具
可视化工具
jconsole
jvisualvm
命令行工具
jps
JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程
1 |
jps // 列出所有JVM进程 |
jmap
Memory Map for Java, 生成虚拟机的内存转储快照(headdump文件)
还可以查询finalize执行队列、Java堆和永久代的详细信息(空间使用率、收集器等)一般结合jhat使用
1 |
jmap -heap {filename.jar} {java_pid} // 显示堆的详细信息使用回收器、参数配置、分代状况等(linux有效) |
jhat
JVM Heap Dump Browser, 用于分析headdump文件,创建一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
1 |
jhat {dump_filename.bin} // 分析堆快照 |
jstack
Stack Trace for Java, 显示虚拟机线程(堆栈)快照
可用于定位线程中出现长时间停顿的原因(线程死锁、死循环、请求外部资源等待等)
1 |
jstack {java_pid} // 打印所有线程的堆栈 |
Java.lang.Thread类通过getAllStackTraces()可以获取到所有线程的SrackTraceElement对象
通过一行代码完成大部分jstack的工作,可用作管理员界面检查线程堆栈
jstat
JVM Statistics Monitorying Tool, 用于收集HotSpot虚拟机各方面的运行数据
显示进程中类的装载、内存、垃圾收集、JIT编译等运行数据 运行期性能定位首选
1 |
// 远程VM进程格式 |
jinfo
Configuration Info for Java, 显示虚拟机配置信息
hprof
展现CPU使用率,统计堆内存使用情况
javap
反编译class文件
1 |
javap {filename.class} // |
Arthas
是Alibaba开源的Java诊断工具
解决
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
jclasslib
字节码查看工具