对于 Java 程序运行的开始的过程就是类加载过程了,如果在类加载过程出现了问题的话会导致程序运行失败、运行异常亦或者获取不到预期的结果。这里总结一些如何调试解析这个过程。
JVM 在启动后,会首先将 .class文件加载到内存,并且对类进行校验、准备、解析、初始化,最终形成 JVM 可以直接使用的 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 | 显示类信息柱状图 |
我们还可以通过jdk自带的工具 jmap 和jhat对某一时刻java进程内的类及其对象的加载情况进行分析。
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 是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 对文件进行分析。
首先在 jdk 安装目录下找到 Java VisualVM并打开。
在菜单栏选择文件->装入,然后选择用 jmap 命令生成的文件。
Java 类加载机制通过 jmap 分析线上的一次异常Java类加载的过程jdk自带dump分析工具–jhat深入浅出JVMjvm 性能调优工具之 jmap观察程序运行时类加载的过程-verbose:class