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

相关推荐
hahaha6016几秒前
HLS高层次综合设计技巧--循环merge和循环split
人工智能·算法·计算机视觉
JAI科研1 分钟前
Deepseek Agent Harness教程(七) | Deepseek Harness不是一个内核加一堆插件
开发语言·人工智能·深度学习·算法·自然语言处理·transformer·vllm
2601_967338713 分钟前
尚硅谷2026尚硅谷Java全栈+Python智能体教程
java·人工智能
集思广益的灰太狼18 分钟前
变频器启动致PLC数据异常?西门子G120配合滤波器EMC抑制方案
人工智能·算法·工控·emc·电磁兼容·变频器·西门子
孙克旭_28 分钟前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
方方洛33 分钟前
vllm教程-03-架构设计
算法·架构
2601_9619017034 分钟前
SpringCloud2023集成Nacos2.4.3
java
玄昌盛不会编程35 分钟前
LeetCode——2091. 从数组中移除最大值和最小值
java·算法·leetcode
Rain的Java大神之路38 分钟前
如何保证接口幂等
java·经验分享·后端·面试·架构
吴声子夜歌39 分钟前
Java——数组和集合(一)
java·开发语言