Jvm(24),回收策略-----标记整理算法

标记/整理算法

标记/整理算法与标记/清除算法非常相似,它也是分为两个阶段:标记和整理。下面LZ 给各位介绍一下这两个阶段都做了什么。

标记:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。

整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。

它GC前后的图示与复制算法的图非常相似,只不过没有了活动区间和空闲区间的区别,而过程又与标记/清除算法非常相似,我们来看GC前内存中对象的状态与布局,如下图所示。

这张图其实与标记/清楚算法一模一样,只是LZ为了方便表示内存规则的连续排列,加了一个矩形表示内存区域。倘若此时GC线程开始工作,那么紧接着开始的就是标记阶段了。此阶段与标记/清除算法的标记阶段是一样一样的,我们看标记阶段过后对象的状态,如下图。

没什么可解释的,接下来,便应该是整理阶段了。我们来看当整理阶段处理完以后,内存的布局是如何的,如下图。

可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。

不难看出,标记/整理算法不仅可以弥补标记/清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价,可谓是一举两得,一箭双雕,一石两鸟,一。。。。一女两男?

不过任何算法都会有其缺点,标记/整理算法唯一的缺点就是效率也不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记/整理算法要低于复制算法。

原文地址:https://www.cnblogs.com/qingruihappy/p/9691371.html

时间: 2024-10-11 10:12:54

Jvm(24),回收策略-----标记整理算法的相关文章

深入理解java虚拟机之——JVM垃圾回收策略

如何判断一个对象是否存活 引用计数算法:给对象中添加一个引用计数器,每当有引用它时,计数器值就加1:当引用 失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用. Java虚拟机里面没有选用引用计数算法来管理内存,其中主要原因是他很难解决对象 之间相互引用的问题. 例如:对象objA和objB都有字段instance字段,切互相赋值,但实际上这两个对象已经不可 能被访问了,但因为他们互相引用着对方,导致他们的引用计数都不为0,于是导致他们无法回收. (Java中这种情况是可以回收的

jvm垃圾回收策略

java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已较少了CLR中内存的GC的内存回收方式,是基于代的内存回收策略,其实在java中,JVM的内存回收策略也是基于分代的思想.这样做的目的就是为了提供垃圾 回收的性能,避免对堆中的所有对象进行检查时的降低程序的响应的性能,因为jvm执行GC时,会stop the word,即终止其它线程的运行,等回收完毕,才恢复其它线程的操作.基于分代的思想是:垃圾收集会更多的对一小部分内存 对象引用进行检查,这一小部分对象的生命周期也更短,从而加快

JVM虚拟机(四):JVM 垃圾回收机制概念及其算法

垃圾回收概念和其算法 谈到垃圾回收(Garbage Collection)GC,需要先澄清什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾箱,然后倒掉.GC中的垃圾,特指存于内存中.不会再被使用的对象,儿回收就是相当于把垃圾"倒掉".垃圾回收有很多中算法:如 引用计数法.标记压缩法.复制算法.分代.分区的思想. 垃圾收集算法 引用计数法:就是个比较古老而经典的垃圾收集算法,其核心就是在对象被其他所引用计数器加1,而当引用时效时则减1,但是这种方式有非常严重的问题:无法处理循环引用

JVM垃圾回收算法和垃圾收集器笔记

概述 程序计数器,本地方法栈,虚拟机栈随线程而生,随线程而灭. Java堆和方法区则不一样,这部分内存分配和回收的都是动态的,垃圾收集器所关注的是这部分内存. 判断对象是否是垃圾的算法 JVM没有选用引用计数算法来管理内存,最主要的是引用计数很难解决对象之间相互循环引用的问题.JVM采用了可达性分析算法来判断对象是否能回收.用GC Roots对象作为起点,向下搜索,搜索走过的路劲称为引用链(reference chain),当对一个对象到GC Roots没有任何引用链时,则证明对象不可用的. 判

Jvm(26),回收策略-----分代收集算法(hotsopt采用的算法)

摘要 当前商业虚拟机的垃圾收集都采用"分代收集"(Generational Collection) 算法,这种算法并没有什么新的思想,只是根据对象的存活周期的不同将内存划分为几块.一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用    适当的收集算法.在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集.而老年代中因为对象存活率高.没有额外空间对它进行分配担保,就必须使用"标记-清

JVM内存分配策略,及垃圾回收算法

本人免费整理了Java高级资料,一共30G,需要自己领取;传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Scala等)程序员在提升开发效率上获得了惊人的便利.理解GC,对于理解JVM和Java语言有着非常重要的作用.并且当我们需要排查各种内存溢

Jvm(25),回收策略----前三种基本回收算法对比

这里LZ给各位总结一下三个算法的共同点以及它们各自的优势劣势,让各位对比一下,想必会更加清晰. 它们的共同点主要有以下两点. 三个算法都基于根搜索算法去判断一个对象是否应该被回收,而支撑根搜索算法可以正常工作的理论依据,就是语法中变量作用域的相关内容.因此,要想防止内存泄露,最 根本的办法就是掌握好变量作用域,而不应该使用前面内存管理杂谈一章中所提到的 C/C++式内存管理方式. 在GC线程开启时,或者说GC过程开始时,它们都要暂停应用程序(stop the world). 它们的区别LZ按照下

jvm垃圾回收算法整理

java推荐 内存的自动化整理 也就是自动化解决给对象分配内存以及回收对象的内存  ,这两个问题也是主要针对java的内存模型 堆 :有效解决内存丢失等问题: 1.内存分类: 新生代: eden内存 新建的对象存储的位置 survivor0 当eden内存空间存满之后就会将存活的对象进行复制进入survivor0空间,eden内存空间进行一次GC回收 survivor1 当Eden内存和survivor0都存满之后,就会将存活的对象复制进入survivor1空间,eden和survivor0都回

jvm垃圾收集(标记-清除,复制,标记-整理,分代)算法

1. 标记 - 清除算法  标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想.标记清除算法分为"标记"和"清除"两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象. 它的主要缺点:①.标记和清除过程效率不高 . ②.标记清除之后会产生大量不连续的内存碎片. . 2. 复制算法 它将可用内存容量划分为大小相等的两块,每次只使用其中的一块.当这一块用完之后,就将还存活的对象复制到另外一块上面,然后在把已使用过的内存空间一次理掉.这样使得每次都是对其