JVM篇 - 如何判断哪些对象是GC Root对象(JDK1.8)

129 阅读1分钟

1、先看代码

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 演示GC Roots
 */
public class Demo2_2 {

    public static void main(String[] args) throws InterruptedException, IOException {
        List<Object> list1 = new ArrayList<>();
        list1.add("a");
        list1.add("b");
        System.out.println(1);
        System.in.read();

        list1 = null;
        System.out.println(2);
        System.in.read();
        System.out.println("end...");

    }
}

2、代码执行过程

2.1、执行代码

image.png

2.2、查看当前所有进程(jps)

image.png

2.3、生成heap转储文件

jmap -dump:live,format=b,file=文件名.bin 进程id

集合清空前的 堆内存信息

image.png

集合清空后的 堆内存信息

image.png

image.png

3、使用查看工具,查看上一步转储的heap文件

工具下载地址

image.png

3.1、打开工具

image.png

image.png

3.2、打开转储的heap文件

image.png

image.png

找到我们关注的GC Roots image.png

image.png

关注我们代码中有哪些可以作为GC Root对象。其他部分可以看看。

image.png

image.png

其他部分内容预览 GC Roots对象.gif