垃圾收集相关算法Test

垃圾回收可以分成两个阶段,分别是标记阶段和清除阶段,本章将重点讲解两个阶段各自使用的算法。标记阶段的任务是标记哪些对象是垃圾,标记算法包括引用计数算法和可达性分析算法。清除阶段的任务是清除垃圾对象,清除算法包括标记--清除算法、复制算法和标记--压缩算法。此外本章还将介绍分代收集算法、增量收集算法、分区算法和对象的finalization机制。

在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。

引用计数算法引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的次数。对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收。引用计数算法的优点是实现简单,垃圾对象便于辨识,判定效率高,回收没有延迟性。但是引用计数算法也存在如下几个缺点:每个对象需要单独的字段存储计数器,这样的做法增加了存储空间的开销。每次赋值操作都需要更新计数器,伴随着加法和减法操作,这增加了时间开销。另外,引用计数器有一个严重的问题,即无法处理循环引用的情况。比如有对象A和对象B,对象A中含有对象B的引用,对象B中又含有对象A的引用。此时对象A和对象B的引用计数器都不为0,但是系统中却不存在任何第3个对象引用了对象A或对象B。也就是说对象A和对象B是应该被回收的垃圾对象,但由于垃圾对象之间互相引用,从而使垃圾回收器无法识别,引起内存泄漏,

相关推荐
小欣加油1 天前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly1 天前
前沿算法深度解析(二)
人工智能·算法·机器学习
wang09071 天前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java1 天前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
徐小夕1 天前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
不知名的老吴1 天前
线程的生命周期之线程“插队“
java·开发语言·python
akunkuntaimei1 天前
2026年高考数学各省真题及答案(完整版)
算法·高考
ANnianStriver1 天前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
Hello:CodeWorld1 天前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法