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

相关推荐
iCxhust10 分钟前
在 emu8086 中可以直接编译运行的完整汇编程序,演示数组的定义、遍历、求和、求最大值。
开发语言·前端·javascript·汇编·单片机·嵌入式硬件·算法
架构源启12 分钟前
OpenClaw 只能命令行触发?自研企业微信实现发消息即执行
java·chrome·自动化·企业微信
Jinkxs18 分钟前
LoadBalancer- 常见负载均衡算法:轮询 / 加权轮询 / 最少连接等基础实现
运维·算法·负载均衡
Brilliantwxx30 分钟前
【C++】认识vector(概念+题目OJ)
开发语言·c++·笔记·算法
逻辑驱动的ken32 分钟前
Java高频面试考点场景题22
java·开发语言·jvm·面试·职场和发展·求职招聘·春招
小则又沐风a38 分钟前
list模拟实现
java·服务器·list
上弦月-编程41 分钟前
C语言链表详解,新手也能看懂! ——从入门到精通的完整教程
java·c语言·c++
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第十篇:识势应势——从认知到行动的完整闭环
人工智能·算法·架构·创业创新·安全架构
risc1234561 小时前
SegmentTermsEnum#postings 和 IntersectTermsEnum#postings
算法·lucene
ffqws_1 小时前
Spring Boot 配置读取全解析:从 application.yml 到 Java 对象的完整链路
java·数据库·spring boot