当前位置: 首页 > 编程日记 > 正文

垃圾回收之标记算法

前言


作为 Java 开发人员,其实是非常幸福的,因为 JVM 的存在,使得 Java 开发人员不需要像 C 或者 C++开发人员那样需要手动申请内存、释放内存,这些资源申请、垃圾回收的操作,JVM 底层直接帮助我们全干了。

这为 Java 开发人员省去了不少事情,但同样也使得像笔者这样的菜鸟,对垃圾回收的概念越来越模糊,甚至压根就不懂什么是垃圾回收。然而现在的面试官越来越坏,逮着程序员的薄弱环节使劲怼,特别喜欢问 JVM 相关知识,尤其是 JVM 调优经验、垃圾回收相关的知识。而作为一名有理想的菜鸟,最近埋头苦学了部分 JVM 知识,现在分享一波垃圾回收相关的知识。

垃圾回收


在 JVM 中,虚拟机规范将一大块内存细分为了很多不同的小区域,而 JVM 要想进行垃圾回收,首先得知道垃圾回收要回收的是哪些区域中的对象。下面这张图相信大家已经见过很多次了,它是虚拟机规范中一张经典的 JVM 内存结构图。图中的运行时数据区包含 5 个部分:堆区、方法区、程序计数器、虚拟机栈、本地方法栈。其中程序计数器、虚拟机栈、本地方法栈是每个线程私有的区域,它们随着线程的创建而生,随着线程的死亡而消失,因此这部分区域不需要 JVM 单独对它们进行垃圾回收。而堆区和方法区中存放的是对象、常量池、类信息等数据,这些数据是所有线程共享的,它们的生命周期不会伴随着线程的生而生,死而死,它们需要 JVM 单独进行垃圾回收。


JVM内存结构
知道了 JVM 中垃圾回收的目标区域,但是要对这些区域中的垃圾进行回收,JVM 首先得知道哪些对象是垃圾。而判断一个对象是否是垃圾,通常有两种算法:引用计数算法、可达性分析算法,下面将依次介绍这两种算法。

引用计数算法

采用引用计数算法来判断一个对象是否存活,其原理是:为每一个对象分配一个计数器,当这个对象被另一个对象引用时,这个计数器就加一;当被另一个对象取消引用时,计数器就减一。当这个计数器的值为零时,就表示当前对象没有被任何对象所引用,那么这个对象就可以被垃圾回收器进行回收了。

引用技术算法实现起来十分简单,也十分高效。但是它有个致命的缺点,就是无法解决循环引用的问题。例如如下示例代码:

public class ReferenceCountTest {private ReferenceCountTest reference;public static void main(String[] args) {ReferenceCountTest objA = new ReferenceCountTest();  ReferenceCountTest objB = new ReferenceCountTest();  objA.reference = objB;  objB.reference = objA;   objA = null;  objB = null;  } 
} 


示例代码中,变量 objA 和 objB 相互之间循环引用,如果采用引用计数算法来判断对象是否存活的话,即使我们将 objA 和 objB 设置为 null 后,由于它们各自的引用计数器均为 1,垃圾回收器会认为 objA 和 objB 还有人在使用,因此不会回收 objA 和 objB。

正是因为引用计数算法无法解决循环引用的问题,因此目前 Java 中的垃圾回收器均没有使用引用计数算法来判断一个对象是否存活,而是采用下面即将介绍的可达性分析算法。

可达性分析算法

可达性分析算法的实现思路是:将一系列被称之为“GC Roots”的根对象作为起始节点,从这个根节点出发,通过引用关系向下寻找它可以到达的对象,寻找过程中经过的路线称之为引用链,一个系统中可以有多个根节点,也就是说 GC Roots 是一个节点的集合。如果一个对象无法通过任何一个 GC Roots 根节点找到,即 0 条引用链,那么这个对象就不是存活对象了,后面在进行垃圾回收时,可以被垃圾收集器回收。


可达性分析算法
如果要使用可达性分析算法来进行垃圾标记,那么就必须保证在整个可达性分析过程当中,系统必须处于一致性快照当中。什么意思呢?就是在可达性分析过程中,不能有用户线程更新对象间的引用关系,否则可达性分析算法的分析结果的准确性就无法保证了。 因此在可达性分析算法的工作当中,会暂停所有的用户线程,也就是”Stop The World“,简称 STW。

GC Roots
在可达性分析算法中提到了 GC Roots 这个概念,那么在 Java 中,有哪些对象可以被作为 GC Roots 呢?分别有如下几种情况。

虚拟机栈中每个栈帧中局部变量表里面的引用对象,如方法的入参,局部变量等。
本地方法栈中的引用对象。
方法区中类的静态属性引用的对象。
方法区中常量池引用的对象,如:字符串常量池引用的对象。
被关键字 synchronized 锁住的对象。
Java 虚拟机内部引用的对象,如:一些常驻的异常对象(NullPointerException、OutOfMemoryError),基本数据类型的 Class 对象,系统类加载器等。
反应 Java 虚拟机内部情况的 JMXBean、JVMTI 中注册的回调、本地代码缓存等。
除了这些固定的 GC Roots 外,根据用户所选的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象”临时性“地加入,共同构成完整的 GC Roots 集合,比如:分代收集器和局部回收。
总结
本文主要介绍了 JVM 垃圾回收的作用区域,以及如何判断一个对象是否是垃圾,通常可以通过引用计数法和可达性分析算法来判断一个对象是否是垃圾,但是在目前 JVM 的垃圾收集器中,采用的都是可达性分析算法,因为引用计数法无法解决循环依赖的问题。最后列举了在可达性分析算法里,Java 中哪些对象可以作为 GC Roots。

垃圾回收通常会分为两个阶段:垃圾标记阶段和垃圾清除阶段。而引用计数算法和可达性分析算法作用的是垃圾标记阶段,后面的文章将会分享垃圾清除阶段的相关算法。

参考
周志明《深入理解 Java 虚拟机》第三版。

相关文章:

将数组转换为字符串

$a1..10000 方法一: $a -join $null 方法二: -join $a 方法三(效率次高): [string]::concat($a) 方法四(效率最高,但写法麻烦): $sb New-Object System.Text.StringBuil…

【73套】Epic Stock Media配乐音效素材合集包

【73套】Epic Stock Media配乐音效素材合集包 大小:114G丨WAV Epic Stock Media 系列音效合辑 包含了战争电影音效、史诗梦幻音效、日常生活音效、森林环境音效、电影预告等诸多音效,可以满足你的各种制作需求。全部WAV无损格式,每个合辑独立…

自定义html托管,10分钟搞定“傻瓜式”的静态网站搭建托管之旅

原文发布于微信公众号:腾讯云存储(关注有惊喜)静态网站:有别于动态网站,它就是只包含静态内容(如图片、音频、视频、HTML、CSS、JS)的网站,不依赖服务器端动态渲染页面。那么静态网站托管应该如何使用呢?今天就和大家分…

调用bat文件执行java文件

set path./jre7/bin--设置jre路径,可以写jre的全路径java -cp "lib/*;" -Xms256m -Xmx512m com.shentong.Main--测试类入口pause 把所有的jar包都放在lib文件下面 转载于:https://www.cnblogs.com/yuwenfeng/p/4911075.html

2022-2028年中国数码相机行业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国数码相机行业市场行业相关概述、中国数码相机行业市场行业运行环境、分析了中国数码相机行…

Android安卓游戏引擎大搜罗

2019独角兽企业重金招聘Python工程师标准>>> 1.AndEngine 简介: AndEngine基于libGDX框架开发,使用OpenGL ES进行图形绘制。同时继承了BOX2D物理引擎,因此能实现一些较为复杂的物理效果。在Rokon停止更新以后,AndEngin…

Spring Boot 2.X 对 web 的开发支持(二)

Spring Boot 2.X 对 web 的支持开发 上章节的 Spring Boot 的入门案例,我们感受到 Spring Boot 简单的配置即可运行项目。 今天了解 Spring Boot 对 web 的支持。 Spring Boot 对 Web 开发的支持很全面,包括开发、测试和部署阶段都做了支持。spring-boot…

Blender建筑可视化技能学习视频教程

Blender建筑可视化技能学习视频教程 chocofur–Blender2021的内部可视化秘密 大小:28G 1920X1080 mp4 语言:英语 信息: 云桥网络 平台获取教程! 了解Blender中完整的内部可视化工作流程是成为一名成功的3D艺术家的关键。向做了十几年的专…

基于DCMTK的DICOM相关程序编写攻略

2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常需要自己编写和DICOM格式的图像相关的各种程序模块,…

计算机组成考试题及答案,计算机组成测试题一参考答案

计算机组成测试题一参考答案一、填空题(每空1分,共20分)1. 设二进制数X2+100(—0.10101100),用15个二进制位来表示它的浮点数,阶码用5位,其中阶符用2位;尾数用10位,其中符号用2位(2100中的100为…

典型的垃圾收集算法

上一编:《垃圾回收之标记算法》 ,用以确认那些垃圾判定为可以回收。 在确定了哪些垃圾可以被回收后,垃圾收集器要做的事情就是开始进行垃圾回收,但是这里面涉及到一个问题是:如何高效地进行垃圾回收。由于Java虚拟机规…

Oracle10g安装中遇到的错误及解决办法

linux解决xhost: unable to open display实用技巧:在Linux下设置xhost方法步骤 第一步:用root登陆linux,启动vnc服务;第二步:根据vnc起来的端口,设置export DISPLAYlocalhost:1(1表示vnc在第一个…

Result Maps collection already contains value for

启动的时候报错,junit报错一样的 Result Maps collection already contains value for mybatis 查了一下应该是 ***mapper.java和 ***mapper.xml解析有问题了, 不能注入了。 按照***mapper.java 里的方法一个一个到***mapper.xml去查 id 结果发现有一个…

创建三维建筑可视化和虚拟现实的最快和最简单的方法

创建三维建筑可视化和虚拟现实的最快和最简单的方法 时长3小时12分 1280X720 Mkv 语言:英语中文字幕(根据原英文字幕机译更准确)原英文字幕 大小解压后:2.86G 共28小节课程 标题:Skillshare–TWINMOTION实时3d架构可…

刚过国家线计算机考研报哪个好,考研估分刚过了去年国家线,今年上岸还有希望吗?有!...

随着2020年考研成绩的陆续发布,考生们的神经也愈发紧张起来。有很多的同学其实在成绩发布之前,就已经通过网上的答案对自己整体的考试分数有了个大概的估计,于是很多同学乃至是学生家长就想问了,如果估分刚刚过了去年的国家线&…

2022-2028年中国数码摄像机市场投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国数码摄像机行业市场行业相关概述、中国数码摄像机行业市场行业运行环境、分析了中国数码摄…

Android中怎么使图片显示

android中经常到利用图片,利用图片时我们都是把图片放在drawable-xxx目录下,因为这里就是存储图片的地方,xxx不用理他,就是关于分辨率而已。 楼主在学习android的时候一直尝试把图片在程序中显示,但是一直不成功&#…

webElement.text()获取到内容为空

使用webElement.text()方法获取字符串时,有时候会获取失败--获取到的内容为空 使用 webElement.getAttribute("attributeName"),通过textContent, innerText, innerHTML等属性获取 public String getText(String string){WebDriverWait wait …

【blender教程】从头到尾全流程创建一辆吉普车

【blender教程】从头到尾全流程创建一辆吉普车 持续时间41小时 30分 包括项目文件 1280X720 MP4 语言:英语中文字幕(根据原英文字幕机译更准确)原英文字幕 大小解压后:34.7G 云桥网络 平台huo取 教程 blender:从头到尾打造吉普…

Hat’s Words(字典树)

Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11314 Accepted Submission(s): 4041 Problem DescriptionA hat’s word is a word in the dictionary that is the concatenation of exactly two…

遥感计算机分类的基本原理,遥感数字图像的计算机分类

《遥感数字图像的计算机分类》由会员分享,可在线阅读,更多相关《遥感数字图像的计算机分类(3页珍藏版)》请在人人文库网上搜索。1、遥感数字图像的计算机分类一、实验类型综合型二、实验目的与要求1、实验目的掌握非监督分类的过程和方法。2、实验要求(1…

Java垃圾回收之新生代垃圾收集器

分代收集算法 Stop-the-World(停止一切) JVM由于要执行GC而停止了应用程序的执行任何一种GC算法中都会发生多数GC优化通过减少Stop-the-world发生时间来提高程序性能 Safepoint (安全点) 分析过程中对象引用关系不会发生变化的…

用x86的模拟器内核记得安装intel的haxm

Android 模拟器一直以运行速度慢著称, 本文介绍使用 Intel HAXM 技术为 Android 模拟器加速, 使模拟器运行度媲美真机, 彻底解决模拟器运行慢的问题。 Intel HAXM (Hardware Accelerated Execution Manager) 使用基于 Intel(R) Virtualizatio…

我焦躁,并不只是心里承受,还是因为我上面担着。

由于工作任务紧、重,最近很焦躁,终于在今天爆发了。在这次爆发中,隐约的感到并不只是自己的“心理承压”能力的问题。 我爆发后,发现虽然任务如此紧张,但是组长只是“紧张”,工作还是“有条有序”的进行着。…

ue4商城资源 Car Configurator Template 汽车配置器模板

ue4商城资源 Car Configurator Template 汽车配置器模板 ue4商城资源 Car Configurator Template 汽车配置器模板 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Car Configurator Template 4.25 汽车配置器模板 素材大小解压后:0.99G 云桥网络…

Sublime Text 3 常用插件以及安装方法(转)

http://www.cnsecer.com/460.html 安装Sublime Text 3插件的方法: 朋友们,小站活着不容易,全靠广告费养着了,如果本文对你有帮助。麻烦动下手点下页面的广告吧,谢谢! 直接安装 安装Sublime text 2插件很方便…

现代计算机基本工作原理,现代计算机的基本工作原理是

现代计算机的基本工作原理是存储程序控制。“计算机”一般是指“电子计算机”,电子计算机(electronic computer)通称电脑,是现代一种用于高速计算的电子计算机器。可以进行数值计算、逻辑计算,具有存储记忆功能,能够按照程序运行&…

Java垃圾回收之老年代垃圾收集器

1、Serial Old 收集器(-XX: UseSerialOldGC, 标记-整理算法) 单线程收集,进行垃圾收集时,必须暂停所有工作线程简单高效,Client模式下默认的老年代收集器2、Parallel Od收集器(-XX: UseParallelOldGC ,标…

linux中awk下 gsub函数用法

gsub函数则使得在所有正则表达式被匹配的时候都发生替换gsub(regular expression, subsitution string, target string);简称 gsub(r,s,t)一、遇到的问题:问题:echo "a b c 2011-11-22 a:d" | awk $4gsub(/-/,"",$4)为啥…

Maya2022基础入门学习教程

Maya2022基础入门学习教程 Maya 2022 Essential Training Maya2022基础入门学习教程 Maya 2022 Essential Training MP4 |视频:h264,1280x720 |音频:AAC,44.1 KHz,2 Ch 技能水平:初级|流派:电子学习|语言:英语中文字幕(机译&…