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

相关推荐
程序员张322 分钟前
Maven编译和打包插件
java·spring boot·maven
写代码的小球1 小时前
求模运算符c
算法
ybq195133454311 小时前
Redis-主从复制-分布式系统
java·数据库·redis
weixin_472339462 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴8502 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
DKPT3 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好奇的菜鸟4 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
大千AI助手5 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
DuelCode5 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis