jvm工具

工具

可视化工具

jconsole

jvisualvm

命令行工具

jps

JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程

1
2
3
4
5
jps // 列出所有JVM进程
jps -q // 输出LVMID,忽略主类的名称
jps -m // 显示进程参数 传递给main的参数
jps -l // 显示所有进程的完整包名(主类的全名,jar包显示jar路径)
jps -v // 显示启动时JVM参数

jmap

Memory Map for Java, 生成虚拟机的内存转储快照(headdump文件)
还可以查询finalize执行队列、Java堆和永久代的详细信息(空间使用率、收集器等)

一般结合jhat使用

1
2
3
jmap -heap {filename.jar} {java_pid} // 显示堆的详细信息使用回收器、参数配置、分代状况等(linux有效)
jmap -histo {java_pid} // 显示堆中对象统计 包括类 实例数 合计容量
jmap -dump:format=b,file={filename} {java_pid} // 存储java堆转储快照

jhat

JVM Heap Dump Browser, 用于分析headdump文件,创建一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果

1
2
3
jhat {dump_filename.bin} // 分析堆快照
jhat -p {port} {dump_filename.bin} // 指定端口
jhat -J-mx8G {dump_filename.bin} // 使用最大8G的内存读

jstack

Stack Trace for Java, 显示虚拟机线程(堆栈)快照

可用于定位线程中出现长时间停顿的原因(线程死锁、死循环、请求外部资源等待等)

1
2
3
4
jstack {java_pid} // 打印所有线程的堆栈
jstack -m {java_pid} // 显示c/c++的堆栈
jstack -l {java_pid} // 显示除堆栈外,锁的附加信息
jstack {/usr/bin/java} {file.core} // 打印堆栈跟踪通过核心dump

Java.lang.Thread类通过getAllStackTraces()可以获取到所有线程的SrackTraceElement对象

通过一行代码完成大部分jstack的工作,可用作管理员界面检查线程堆栈

jstat

JVM Statistics Monitorying Tool, 用于收集HotSpot虚拟机各方面的运行数据

显示进程中类的装载、内存、垃圾收集、JIT编译等运行数据 运行期性能定位首选

1
2
3
4
5
6
7
8
9
10
11
// 远程VM进程格式
// [protocol:][//]lvmid[@hostname[:port]/servername]
// jstat [option {java_pid} 间隔 次数]
jstat -gc {java_pid} // 监控堆(Eden survivor 老年代 永久代等)容量 使用空间 GC时间合计
jstat -class // 类的装载 卸载数量 总空间以及类装载所使用时间
jstat -compiler // 输出JIT编译器编译过的方法、耗时等信息

// E: Eden
// S0 S1: Survivor的2个区
// O: 老年代
// P: 永久代

jinfo

Configuration Info for Java, 显示虚拟机配置信息

hprof

展现CPU使用率,统计堆内存使用情况

javap

反编译class文件

1
2
3
4
javap {filename.class} // 
javap -constants {filename.class} // 输出静态final常量
javap -c {filename.class} // 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令
javap -verbos {filename.class} // 打印堆栈大小、各方法的locals及args参数,以及class文件的编译版本

Arthas

是Alibaba开源的Java诊断工具

解决

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?

jclasslib

字节码查看工具

 上一篇