<aside> 😀 这里写文章的前言: JVM的垃圾回收机制

</aside>

📝 简介

Java 的对象使用的是堆空间的内存, 方法的执行是栈帧的入栈出栈, 引用和局部变量可以随着入栈出栈直接清理, 但是引用对应所在堆空间的内存则不能通过出栈的结束而回收, 因为堆空间是线程共享的, 并不确定是否有其他线程引用了这块内存, 需要 GC 机制来进行自动的清理

📔垃圾收集

判断一个对象是否可回收

  1. 引用计数: 给对象添加一个引用计数器,当对象增加一个引用计数器加1,引用失效时计数器减1。引用计数为0时,可被回收

缺点: 两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收

objA.instance = objB;
objB.instance = objA;
  1. 可达性分析

通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是都是可用的,不可达的对象可被回收

GC Roots 一般包含:

  1. 虚拟机栈中引用的对象
  2. 本地方法栈中引用的对象
  3. 方法区中的常量引用的对象
  4. 方法区中类静态属性引用的对象