定位JVM相关的问题时,知识和经验是关键基础,数据是依据,工具是运用知识处理数据的手段。JVM数据包括运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。使用JVM监控和分析工具可以提高分析数据、定位解决问题的效率,常用监控工具如下表所示,具体各工具的用法可以Google对应JDK版本的文档。
名称 | 用途 |
---|---|
jps | JVM Process Status Tool显示系统内所有Hotspot虚拟机进程 |
jstat | JVM Statistics Monitoring Tool,收集Hotspot虚拟机各方面运行数据 |
jinfo | Configuration Info for Java,显示虚拟机配置信息 |
jmap | Memory Map for Java,生成虚拟机内存转储快照(heapdump文件) |
jhat | JVM Statistics Heap ,用于分析heapdump文件,它会建立一个HTTP/HTML服务器,可以在浏览器中查看分析结果 |
jstack | Stack Trace for Java,显示虚拟机的线程快照 |
JDK可视化工具
Java虚拟机规范详细描述了虚拟机指令级中每条指令的执行过程,执行前后对操作数栈、局部变量表的影响等细节。但随着技术的发展,虚拟机规范中的描述逐渐成为虚拟机实现的概念模型,即实际实现的虚拟机只能保证与规范实现等效。在分析程序执行语义时(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为时(虚拟机是怎么做的、性能如何)时,在字节码层面上分析就没有什么意义了。需要使用HSDIS这类反汇编插件,把动态生成的本地代码还原为汇编代码输出。
方法区溢出
方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收掉,判定条件是非常苛刻的。在经常动态生成大量 Class 的应用中,需要特别注意类的回收状况。这类场景除了上面提到的程序使用了 GCLib 字节码增强外,常见的还有:大量 JSP 或动态产生 JSP 文件的应用( JSP 第一次运行时需要编译为Java 类)、基于 OSGi 的应用(即使是同一个类文件,被不同的加载器加载也会视为不同的类)等。