Java 对类信息追踪
对于 Java 程序运行的开始的过程就是类加载过程了,如果在类加载过程出现了问题的话会导致程序运行失败、运行异常亦或者获取不到预期的结果。这里总结一些如何调试解析这个过程。
Java 类加载过程
JVM
在启动后,会首先将 .class
文件加载到内存,并且对类进行校验、准备、解析、初始化,最终形成 JVM
可以直接使用的 Java
类型。
Java 控制台打印类加载情况
启动 java 程序时通过添加 -verbose:class
选项可以实现在控制台打印进程运行过程中类的加载和卸载情况。
java -verbose:class -jar hello.jar com.example.Main
控制台打印结果:
对应的虚拟机打印类信息的选项还有-XX:+TraceClassLoading
可以实现跟踪类的加载;-XX:+TraceClassUnloading
选项可以实现 跟踪类的卸载;-XX:+PrintClassHistogram
可以实现显示类信息柱状图。
参数 | 含义 |
---|---|
-verbose:class | 跟踪类的加载和卸载 |
-XX:+TraceClassLoading | 跟踪类的加载 |
-XX:+TraceClassUnloading | 跟踪类的卸载 |
-XX:+PrintClassHistogram | 显示类信息柱状图 |
Java 获取类加载信息
我们还可以通过jdk自带的工具 jmap
和jhat
对某一时刻java进程内的类及其对象的加载情况进行分析。
jmap
jmap
是一个多功能的命令。它可以将 java
进程在运行中的某一时刻内存情况导出成文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader
的信息以及 finalizer
队列。
# 查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
jmap -heap pid
现在我们将java
进程在运行中的某一时刻内存情况导出成文件,然后查看类及其某一时刻的加载信息
# jmap -dump:format=b,file=heapdump.hrpof pid
jmap -dump:format=b,file=heapdump.hrpof 1556
然后我们可以使用jhat
命令创建服务器来查看详情。
使用 jhat
分析jmap
生成的堆快照
jhat
是Java堆分析工具(Java heap Analyzes Tool
)。JDK自带工具。 命令与jmap搭配使用, 来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/Web服务器, 生成堆转储快照的分析结果后, 可以在浏览器中查看.
# jhat -J-Xmx1024M /path/to/file
jhat -J-Xmx1024M .\heapdump.hrpof
jhat
会在本地启动一个端口为7000
的服务器,并且显示堆信息
我们可以使用这个页面简单的进行分析堆信息,如果觉得这个网页太简单的话可以使用 Java VisualVM
对文件进行分析。
使用 Java VisualVM分析 jmap dump堆文件
首先在 jdk 安装目录下找到 Java VisualVM
并打开。
在菜单栏
选择文件->装入,然后选择用 jmap
命令生成的文件。
参考资料
Java 类加载机制
通过 jmap 分析线上的一次异常
Java类加载的过程
jdk自带dump分析工具–jhat
深入浅出JVM
jvm 性能调优工具之 jmap
观察程序运行时类加载的过程-verbose:class