视频地址:https://www.bilibili.com/video/BV1S44y1z7on

垃圾回收

垃圾回收(Garbage Collection,下文简称GC)也称为垃圾收集,Java 程序会不定时地被唤起检查是否有不再被使用的对象,并释放它们占用的内存空间。

垃圾回收需要完成的三件事情: 哪些内存需要回收 什么时候回收 如何回收

引用计数法

给每个创建的对象添加一个引用计数器,每当此对象被某个地方引用时,计数值 + 1,引用失效时 -1,所以当计数值为 0 时表示对象已经不能被使用。引用计数算法大多数情况下是个比较不错的算法,简单直接 判定效率高,也有一些著名的应用案例但是对于Java虚拟机来说,并不是一个好的选择,因为它很难解决对象直接相互循环引用的问题。

可达性分析算法

在主流的商用程序语言如 Java、C# 等,都是通过可达性(Reachability Analysis)来判断对象是否存活的。此算法的基本思路就是通过一系列的“GC Roots”的对象作为起始点,从起始点开始向下搜索到对象的路径。搜索所经过的路径称为引用链(Reference Chain),当一个对象到任何 GC Roots 都没有引用链时,则表明对象不可达,即该对象是不可用的。

可以作为 GC Root 的对象

  1. Java虚拟机栈(栈帧中的局部变量表)中的引用所引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(Native方法)引用的对象