要想深入了解 JVM 自身,需要使用 Java 的监控工具。JDK 自带以下所列工具
-
jcmd 它用来打印 Java 进程所涉及的基本类、线程和 VM 信息。它适用于脚本
% jcmd process_id command optional_arguments
jcmd help 可以列出所有的命令。
-
jconsole
提供 JVM 活动的图形化视图,包括线程的使用,类的使用和 GC 活动
-
jhat
读取内存堆转储,并有助于分析。这是事后使用的工具
-
jmap
提供堆转储和其他 JVM 内存使用的信息。可以适用于脚本,但堆转储必须在事后分析工具中使用
-
jinfo
查看 JVM 的系统属性,可以动态设置一些系统属性。可适用于脚本
-
jstack
转储 Java 进程的栈信息。可适用于脚本
-
jstat
提供 GC 和类装载活动的信息。可适用于脚本
-
jvisualvm
监视 JVM 的 GUI 工具,可用来剖析运行的应用,分析 JVM 堆转储(时候活动,虽然 jvisualvm 也可以实时抓取程序的堆转储)
基本的 VM 信息
-
查看 JVM 运行的时长
% jcmd process_id VM.system_properties
或
% jinfo -sysprops process_id
这包括通过命令行-D 标志设置的所有属性,应用动态添加的所有属性和 JVM 的默认属性 -
查看 JVM 版本
jcmd process_id VM.version
-
jconsole 的”VM 摘要“页可以显示程序所用的命令行,或者用 jcmd 显示
jcmd process_id VM.command_line
-
获取对应用生效的 JVM 调优标志
jcmd process_id VM.flags [-all]
-
获取进程中所有标志的值
jinfo -flag PrintGCDetails process_id
小结:
-
jcmd 可用来查找运行中的应用所在 JVM 的基本信息,包括所有调优标志的值。
-
命令行上添加-XX:+Printflagsfinal 可输出标志的默认值。这在查看特定平台自动优化所判定的默认值是很有用。
-
jinfo 在检查(某些情况加可以更改)单个标志时很有用
线程信息
jconsole 和 jvisualvm 可以实时显示应用中运行的线程数量。
-
查看运行线程的栈信息,对于判断线程是否阻塞很有用。
jstack process_id
-
通过 jcmd 获取栈信息
jcmd process_id Thread.print
类信息
jconsole 和 jstat 可以提供应用已使用类的个数。jstat 还能提供类编译相关的信息。
实时 GC 分析
jconsole 可以用实时图显示堆的使用情况。jcmd 可以执行 GC 操作。jmap 可以打印堆的概况,永久代信息或者创建堆转储。jstat 可以为垃圾收集器正在执行的操作生成许多视图
事后堆转储
jvisualvm 的 GUI 界面可以捕获堆转储,可以用命令行 jcmd 或 jmap 生成。堆转储是堆使用情况的快照,可以用不同的工具进行分析,包括 jvisualvm 和 jhat。传统上,第三方处理堆转储的工具都领先 JDK,像 Eclipse Memory Analyzer Tool。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于