57.使用MAT和JProfiler查看GC Roots
1.使用MAT
查看GC Roots
MAT
简介
下载:https://www.eclipse.org/mat/downloads.php- 生成
dump
文件的两种方式a)
使用jmap
命令b)
使用JVisualVM
生成dump
演示:package jvn; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Scanner; public class GCRootsTest { public static void main(String[] args) { List<Object> numList = new ArrayList<>(); Date birth = new Date(); for (int i = 0; i < 100; i++) { numList.add(String.valueOf(i)); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("数据添加完毕,请操作:"); new Scanner(System.in).next(); numList = null; birth = null; System.out.println("numList、birth已置空,请操作:"); new Scanner(System.in).next(); System.out.println("结束"); } }
- 运行上面的代码,打开
JVisualVM
,找到对应的进程,点击堆 Dump
如下图 - 保存生成的
dump
文件,这样就生成了dump
文件 - 使用
MAT
查看dump
文件的GC Roots
。如下图所示,使用MAT打开上面产生的dump
文件,然后选择Java Basics -> GC Roots
- 找到
Thread
里面的mian thread
。如下图所示。 - 可以看到
ArrayList
变量numList
和Date
变量birth
都是GC Roots
。
2.使用
JProfiler
查看GC Roots
在日常工作中,通常不需要区查看所有的
GC Roots
,一般是针对某一个对象去查看它的GC Roots
。- 运行上面的程序,点击
Eclipse
里面的JProfiler
- 选择
All Objects
查看所有的对象。 - 选择
View->Mark Current Values
4.选中想要查看GC Roots
的对象,比如第一个char
数组对象。右击然后选中Show Selection In Heap Walker
5.如下图所示,在打开的Heap Walker
中,选中References
,然后选择一个对应的一个char[]
。最后选择Incoming references
,点击Show Paths To GC Root
。就可以查看到对应这个char
数组对象,它的GC Roots
是静态变量Static Out of class java.lang.System
。
- 运行上面的代码,打开