垃圾收集相关算法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是应该被回收的垃圾对象,但由于垃圾对象之间互相引用,从而使垃圾回收器无法识别,引起内存泄漏,

相关推荐
纪念 22923 分钟前
C++ 算法(模拟)
开发语言·c++·算法
揽星河..25 分钟前
【C语言】函数
c语言·算法
zwc321043205528 分钟前
Day 2:图像内存、数据类型与stride
c++·人工智能·opencv·算法·计算机视觉
Wang's Blog40 分钟前
Java 项目实战: 交友项目 - 项目:需求分析与滑动数据设计
java·开发语言·交友
重生之小比特42 分钟前
【算法拾光】模拟|提莫攻击 + N 字形变换
算法·模拟
前端 贾公子1 小时前
第 5 章:Codex 从可运行程序到可交付工具
java·前端·数据库
東隅已逝,桑榆非晚1 小时前
AVL数实现
c++·笔记·学习·算法
CoderYanger1 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc
驭渊的小故事2 小时前
LeetCode 算法题解:滑动窗口与数组合并的实战应用
算法·leetcode·职场和发展
一条泥憨鱼2 小时前
【Kafka】零基础学习教程
java·分布式·学习·kafka