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

https://cdn.nlark.com/yuque/0/2021/png/576791/1631869098701-9f900e93-8a6f-41f8-870c-f9fa985dc3e7.png#clientId=uf1a5aa0f-0370-4&from=paste&height=427&id=u4b3dffa9&originHeight=854&originWidth=1752&originalType=binary&ratio=1&size=849323&status=done&style=none&taskId=u88ce96df-b24c-4b5e-8489-6d3e814f4e6&width=876

垃圾回收

https://cdn.nlark.com/yuque/0/2021/png/576791/1631869174590-0c7861a5-1fee-4b8c-a9f2-a747d8539577.png#clientId=uc76d30ac-f345-4&from=paste&height=477&id=u36301e6d&originHeight=954&originWidth=1726&originalType=binary&ratio=1&size=895140&status=done&style=none&taskId=u5383eab0-85ab-4bec-871f-b0cdc457292&width=863

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

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

https://cdn.nlark.com/yuque/0/2021/png/576791/1631870063190-d6a4d97e-42a8-4f9b-b9cb-25880e0d1290.png#clientId=ue7095214-1922-4&from=paste&height=419&id=qW1Bt&originHeight=838&originWidth=1728&originalType=binary&ratio=1&size=655148&status=done&style=none&taskId=u490c7854-c713-4a7b-8f70-31757769ad2&width=864

引用计数法

https://cdn.nlark.com/yuque/0/2021/png/576791/1631870206597-1adbdce3-b4da-40b3-b1e0-79582502bdb3.png#clientId=u9ee787c1-880e-4&from=paste&height=476&id=ubc6931c7&originHeight=952&originWidth=1740&originalType=binary&ratio=1&size=1064218&status=done&style=none&taskId=u4076d7a4-a07d-4b4b-b4f1-df5e0ad3ba6&width=870

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

可达性分析算法

https://cdn.nlark.com/yuque/0/2021/png/576791/1631870471299-f713e3bb-a2f6-4aaf-96e8-33e98ea7f3e6.png#clientId=u9ee787c1-880e-4&from=paste&height=475&id=u8d3e1902&originHeight=950&originWidth=1750&originalType=binary&ratio=1&size=1022015&status=done&style=none&taskId=u2f0c6cd8-27c6-4d54-8d2b-26d86c204eb&width=875

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

可以作为 GC Root 的对象

https://cdn.nlark.com/yuque/0/2021/png/576791/1631870913010-1a35da21-908b-4a9e-9965-8ce2e1e0c235.png#clientId=u822f88ac-cfc2-4&from=paste&height=421&id=ua681b2e3&originHeight=842&originWidth=1712&originalType=binary&ratio=1&size=1071008&status=done&style=none&taskId=uedfee6b5-05ca-4cfa-bb86-8fa2b562bd6&width=856

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