JVM学习笔记(三)垃圾回收

相关文章:

笔记参考文章:JVM 学习笔记(二)垃圾回收_CodeAli的博客-CSDN博客

一、如何判断对象可以回收

1. 引用计数法

当一个对象被引用时,就当引用对象的值加一,当值为 0 时,就表示该对象不被引用,可以被垃圾收集器回收。这个引用计数法听起来不错,但是有一个弊端,如下图所示,循环引用时,两个对象的计数都为1,导致两个对象都无法被释放。(java虚拟机垃圾回收没有采用它)

JVM学习笔记(三)垃圾回收_第1张图片

 2. 可达性分析算法

  • Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象。

具体做法是:扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以回收。

2.1 哪些对象可以作为 GC Root ?

堆分析工具:MAT,eclipse官网下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

JVM学习笔记(三)垃圾回收_第2张图片

 2.2 案例

public static void main(String[] args) throws IOException {

        ArrayList list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add(1);
        System.out.println(1);
        System.in.read();

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

 
  

第一步:运行上面的代码后,找到.class文件的位置,选中->右键->Open In->Terminal,然后使用命令jps查看当前系统中有哪些 java 进程;

JVM学习笔记(三)垃圾回收_第3张图片

第二步:执行如下命令,生成转储文件1.bin,然后在Run窗口回车让程序继续执行下面的代码,最后再回到Terminal窗口执行命令 jmap -dump:format=b,live,file=2.bin 10396 这时便生成了两个转储文件;

jmap -dump:format=b,live,file=1.bin 10396

参数解释:

  • 参数"-dump:":表示不是查看堆内存的使用情况,而是要把当前堆内存的状态转储到文件;
  • format=b:表示指定转储文件的格式为二进制格式;
  • live:抓快照时只关心存活的对象,过滤掉那些被垃圾回收掉的;且这个参数表示抓快照前会进行一次垃圾回收,因为进行垃圾回收后才知道哪些是存活对象;
  • file=1.bin:指定转储文件的文件名;(当前目录下)
  • 10396:进程id

第三步:用刚刚下载的堆内存分析工具MAT打开上面生成的文件进行分析;对比两个文件发现,ArrayList对象被回收掉了。

JVM学习笔记(三)垃圾回收_第4张图片

JVM学习笔记(三)垃圾回收_第5张图片在这里插入图片描述

延伸:区分引用变量和对象

JVM学习笔记(三)垃圾回收_第6张图片

MAT工具使用遇到的问题

双击运行程序时,提示下面的错误。此时,需要在官网下载一个JDK11的压缩包,解压后放在磁盘中某个位置,如D:\JavaTools\jdk-11.0.19;然后打开MAT安装目录下的MemoryAnalyzer.ini文件,添加下方两行代码,表示指定以JDK11方式启动。这样,再次双击运行MAT工具时,便可正常启动。

JVM学习笔记(三)垃圾回收_第7张图片

JVM学习笔记(三)垃圾回收_第8张图片

-vm
D:/JavaTools/jdk-11.0.19/bin/javaw.exe

JVM学习笔记(三)垃圾回收_第9张图片MAT工具使用的文章

  • Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用_刘Java的博客-CSDN博客
  • MAT(Memory Analyzer Tool)工具使用超详细版_mat工具_隐0士的博客-CSDN博客
  • MemoryAnalyzer指定JDK版本_memoryanalyzer 指定jdk_大数据男的博客-CSDN博客

3. 四种引用

 

二、垃圾回收算法


三、分代垃圾回收


四、垃圾回收器


五、垃圾回收调优

 

你可能感兴趣的:(jvm,学习,笔记)