jvm垃圾回收机制_干货|JVM垃圾回收机制

c5a4fb2a1ec7df9a2a9be3f021521f5e.png

前言

不同于C++程序员必须自己完成内存的分配、使用和释放,JAVA语言提供了垃圾回收机制(GC,Garbage Collection),所以JAVA程序员仅需要负责分配和使用内存即可,而释放内存则由GC负责。这样程序员就从讨厌的内存管理的工作中脱身了。本文主要给大家介绍一下JVM如何查找需要被回收的对象实例与垃圾收集算法。

查找可回收对象

我们都知道垃圾回收机制是将内存中不可能在被使用的的对象实例(可回收的对象实例)回收释放其所占用的内存,以供其他对象使用。JAVA的垃圾回收机制是对JAVA堆和方法区的内存回收。那么CG是怎么知道该对象是否还会使用呢?

一、引用计数算法(Reference Counting)

引用计数算法简单的讲就是给每个对象中添加一个引用计数器, 每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1,当对象的计数器为0就表示该对象已“死”,可以被回收了。虽然这种算法实现简单,判定效率也高。但是大部分JAVA虚拟机却没有使用此算法,因为这个算法很难解决对象之间互相循环引用的问题。

二、可达性分析算法(Reachability Analysis)

可达性分析算法是通过被称为 “GC Roots" 的对象作为起始点, 从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连,就是从GC Roots到这个对象不可达时,则证明此对象是不可用的。如图1.1。对象 2、对象 4、对象 6不可到达GC Roots所以会被回收。

a34f0c013753e5e7a7af23438d0aaca5.png
图1.1

垃圾收集算法

通过上文我们知道了JVM如何查询需要被回收的对象实例,那么JVM是通过什么方法把对象收回的呢?不同虚拟机回收内存的方法各不相同,主流的方法有标记-清除算法、复制算法、标记-整理算法和分代收集算法。

一、标记-清除算法(Mark-Sweep)

标记-清除算法分为“标记”和“清除”两个阶段:首先标记出所有需要可收的对象,在标记完成后统一回收所有被标记的对象。如上文所介绍,标记过程其实就是找出不可能在被使用的对象实例。如图1.2首先标记出需要被回收的对象,然后将这些对象回收,回收后的状态如图1.3。

10f579e67c738f2c742bc52f7ea1351f.png
回收前状态 图1.2

e4283b1a7d12790dd7a40d98b8e9b1d1.png
回收后状态 图1.3

标记-清除算法主要有两个不足:一个是效率问题, 标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

二、复制算法(Copying)

复制算法将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的这一块的内存空间全部清理掉。这样使得每次GC是对整半个内存区域进行回收,内存分配时也就不用考虑内存碎片等问题,只要移动堆指针,按顺序分配内存即可。这种方式实现简单,运行高效。但是这种算法的代价是将内存缩小为原来的一半,未免太高了一点。复制算法的执行过程如图1.4与图1.5所示。

710d6713448699b39516e1374ee91929.png
回收前状态 图1.4

504cf1005682ce53edd65d66ada9cb2e.png
回收后状态 图1.5

三、标记-整理算法(Mark-Compact)

标记-整理算法,标记过程与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动, 然后直接清理掉端边界以外的内存,“标记-整理”算法的过程如图1.6与图1.7所示。

10f579e67c738f2c742bc52f7ea1351f.png
回收前状态 图1.6

531acda05072d27e33773d0d30ff5241.png
回收后状态 图1.7

四、分代收集算法(Generational Colllection)

当前主流虚机的垃圾收集都采用“分代收集”,这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般是把JAVA堆分为新生代和老年代(新生代与老年代后续会有文章介绍),这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、所以使用“标记-清除”或者“标记-整理” 算法来进行回收。

更多文章可关注微信公众号:IT鸡窝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML的列表说明

<ul></ul>无序列表&#xff08;Unordered List&#xff09; <ol></ol>有序列表 (Ordered List) <li> 标签定义列表项目。 <li> 标签可用在有序列表 (<ol>) 和无序列表 (<ul>) 中 两个常用的CSS列表属性 CSS3帮助文档 li…

计算机考试网络应用题一定要做到ie浏览器,网络远程教育统考单项练习:计算机应用基础之Internet应用部分(二)...

计算机考试的分数提高离不开日常的练习&#xff0c;下面&#xff0c;就做几道Internet应用部分的题目练习和巩固一下吧&#xff01;1、在IE9浏览器中按地址栏后的“停止”按钮&#xff0c;浏览器将会______。A.中断正在浏览的web页的连接B.关闭该web页的页面C.关闭浏览器窗口D.…

javascript实现图片轮播_第2章 第9节 JavaScript(四)

● 知道哪些ES6&#xff0c;ES7的语法参考回答&#xff1a;promise&#xff0c;await/async&#xff0c;let、const、块级作用域、箭头函数● promise和await/async的关系参考回答&#xff1a;都是异步编程的解决方案● 问了一段js代码&#xff0c;输出结果是什么● js的数据类…

HTML的HTTP 中 GET 与 POST 的区别

99% 的人都理解错了 HTTP 中 GET 与 POST 的区别&#xff08;转&#xff09;转自&#xff1a;WebTechGarden 微信公众号GET 和 POST 是 HTTP 请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过 WEB 开发的人都能说出一二。最直观的区别就是 GET 把参数包含在 UR…

利用计算机可产生随机数,一种利用计算机生成随机数的方法

一种利用计算机生成随机数的方法(2012-07-16 23:22:33)标签&#xff1a;随机数函数数值计数器程序运行杂谈这里介绍一种利用计算机生成随机数的方法&#xff0c;微机都有系统计数器记录自运行开始以来的脉冲数&#xff0c;这是个规律变化的数字&#xff0c;只用它是不能产生随机…

每天最重要的2小时

每天最重要的2小时 各位优秀的同学们&#xff0c;大家早上好&#xff01; 真的特别开心&#xff0c;我们还能继续相约YY空中平台一起学习。一个人走得快&#xff0c;一群人才能走得远。 我是来自一组的金鱼&#xff0c;就是那位拥有“七世记忆”的金鱼&#xff0c;原产地美…

html360度视角观赏,360度全景图是如何生成的?

360度全景图是如何生成的?360度全景图以其生动的交互和沉浸的体验&#xff0c;一直深受很多摄影爱好者的喜欢。不过对于普通的观赏者而言&#xff0c;这种可以360度自由观看的图片&#xff0c;还是具有神奇的魅力。今天&#xff0c;我就讲一讲一张360度全景图是如何生成的吧!普…

未结束的字符文字_PAT B1042:字符统计

题目描述&#xff1a;请编写程序&#xff0c;找出一段给定文字中出现最频繁的那个英文字母。输入格式&#xff1a;输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成&#xff0c;至少包含 1 个英文字母&#xff0c;以回车结束&#…

圣诞表白html,圣诞节表白,最浪漫的表白方式

圣诞节是一个浪漫的节日&#xff0c;红色的圣诞&#xff0c;白色的你们&#xff0c;再适合表白不过了。那么&#xff0c;圣诞节表白&#xff0c;最浪漫的表白方式有哪些呢?和小编一起来看看吧!圣诞节表白1.看着梦幻的圣诞彩灯说“我能喜欢你吗”冬夜绚丽彩灯下的告白&#xff…

怎么发朋友圈才是合适和得体的?

怎么发朋友圈才是合适和得体的&#xff1f; 怎么发朋友圈才是合适和得体的&#xff1f;这个问题估计困扰了不少人。其实你转换一下想法&#xff0c;你作为别人朋友圈的读者&#xff0c;希望看到的是什么内容&#xff1f; 1.这人最近在忙什么&#xff1f; 有没有可能合作。 …

python 3d绘图库_python – 用于科学3d绘图的Mayavi的替代品

在没有令人满意的第一个答案和无法解释的downvote之后编辑&#xff1a; 我需要绘制一个在3D网格中构造的标量字段,如下所示&#xff1a; import numpy as np from mayavi import mlab dt 10 X,Y,Z np.mgrid[0:dt,0:dt,0:dt] F X**2Y**2Z**2 test mlab.figure(size (1024,7…

python数字转字符串_python如何将字符转换为数字

int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符…

计算机网络中缓存技术,编程达人

计算机缓存也就是通常说的Cache&#xff0c;对计算机编程有所了解的应该都知道&#xff0c;缓存常与Redis联系在一起&#xff0c;但是Redis仅仅是应用中的一部分。1、浏览器缓存浏览器面对的问题是网络访问的速度远远低于本地访问的速度&#xff0c;每次都访问造成网络开销太大…

计算机是怎么RUN起来的

1.实际上计算机只会实现输入、运算、输出 这三大模块缺一不可&#xff0c;缺少输入意味着没有用户能使用&#xff0c;缺少运算相当于一条电线毫无意义&#xff0c;缺少输出相当于一直堆积信息的垃圾箱 因此计算机的硬件是由大量的IC(Integrated Circuit 集成电路)组成&#…

python缺点这么多、为什么还流行_Python这么火,为什么说它不是未来的编程语言?...

本文转载自公众号“读芯术”(ID&#xff1a;AI_Discovery) Python这两年非常火&#xff0c;随处可见的广告让它逐渐变成了一种老少皆知的存在。 虽然问世几十年后&#xff0c;Python才得到编程社区的重视。 但是&#xff0c;其发展的势头似乎无人能及。自2010年年初以来&#x…

与计算机硬件系统紧密相关的程序设计语言是,与计算机硬件系统紧密相关的程序设计语言是...

摘要&#xff1a;计硬件智慧_章节测安全案树_食品试答。系统相关序设星尔章节应用雅_答案_超测验数学。紧密计语星尔整合章节满分雅_答案_超测试思维。...计硬件智慧_章节测安全案树_食品试答。算机学营销单元答案市场。系统相关序设星尔章节应用雅_答案_超测验数学。学_信公智…

快速掌握一门计算机语言,程序员5种编程入门方法,快速学会一门编程语言!...

技术更新太快&#xff0c;精通一门编程语言已经实属不易&#xff0c;又怎么好意思说精通多门语言呢?这对于编程思想也是大有裨益的。每门设计语言都有其独特的设计思想&#xff0c;譬如PHP的关联数组perl、Ruby的对象模型源自Smalltalk。如何快速学会一门编程语言?下面w3csch…

数据结构与算法基本

栈的算法&#xff1a; 计算机内部空间是连续存储的&#xff0c;但是可以通过逻辑上改变内存的物理结构&#xff0c;数据在内存上呈现出的是连续分布状态 主要的典型数据结构 在实现栈这种数据结构时&#xff0c;首先要定义一个数组和一个变量。数组中所包含的元素个数就是栈的…

synchronized不能锁静态变量_面试官:请说一下对象锁和类锁的区别

有锁才有自由生活中不存在绝对的自由&#xff0c;绝对的自由通常对应的无序和混沌&#xff0c;只有在道德、法律、伦理的约束下的相对自由&#xff0c;才能使人感受到自由。而在多线程编程中&#xff0c;锁是至关重要的&#xff0c;锁就是道德&#xff0c;就是法律约束&#xf…

计算机主板开机接线端子,装机必看,机箱前置面板接线向导,不怕再接错线了...

对于新手来说&#xff0c;在自己DIY一台电脑整机的时候&#xff0c;肯定是既兴奋又恐慌。兴奋是自己总算能亲自动手&#xff0c;组装一台自己称心如意且个性化十足的台式机。让大家感到恐慌的是主板那么多针脚和接口&#xff0c;该从何处下手&#xff0c;对于不懂行不专业的人来…