在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。
Heap Dump是什么?
Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。
我们可以通过Heap Dump做哪些事情?
一般在Heap Dump文件中可以获取到(这仍然取决于heap dump文件的类型)如下信息:
-
对象信息:类、成员变量、直接量以及引用值;
-
类信息:类加载器、名称、超类、静态成员;
-
Garbage Collections Roots:JVM可达的对象;
-
线程栈以及本地变量:获取快照时的线程栈信息,以及局部变量的详细信息。
也就是说我们可以对上面这些内容进行分析。通常可以基于Heap Dump分析如下类型的问题:
-
找出内存泄漏的原因;
-
找出重复引用的jar或类;
-
分析集合的使用;
-
分析类加载器。