第236天学习打卡(知识点回顾 常见的垃圾回收算法)
Posted doudoutj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第236天学习打卡(知识点回顾 常见的垃圾回收算法)相关的知识,希望对你有一定的参考价值。
知识点回顾
常见的垃圾回收算法
- 引用计数: java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以被回收。简单来说,给对象中添加一个引用计数器,每当有一个地方引用它,计数器值就加1,每当有一个引用失效时,计数器值减1。任何时刻计数器值为零的对象就是不可能再被使用的,那么这个对象就是可回收对象。为什么主流的Java虚拟机里面都没有选用这种算法呢? 其中最主要的原因就是它很难解决对象之间相互循环引用的问题。
- 缺点:每次对对象赋值均要维护引用计数器,且计数器本身也有一定的消耗,较难处理循环引用。JVM的实现一般不采用这种方式。
为了解决引用计数法的循环引用问题,Java使用了可达性分析的方法:
跟踪(Tracing):
-
复制
-
标记清除
-
标记整理
-
Mark-Sweep(-Compact)
GC roots或者说tracing GC的根集合就是一组必须活跃的引用。
基本思路就是通过一系列名为"GC Roots" 的对象作为起始点,从这个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即给定一个集合的引用作为根触发,通过引用关系遍历对象图,能被遍历到的可达的对象就被判断是存活的;没有遍历到的就自然被判定为死亡。
Java中可以作为GC Roots的对象:
- 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
- 方法区中的类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中INI(Native方法)引用的对象。
以上是关于第236天学习打卡(知识点回顾 常见的垃圾回收算法)的主要内容,如果未能解决你的问题,请参考以下文章