04-垃圾回收算法

AlgoZenith
• 阅读 1160

垃圾回收算法

确定了回收对象后,垃圾收集器要做的事情就是开始进行垃圾回收,但是如何高效地进行垃圾回收是我们需要考虑的问题。


(1)Mark-Sweep 标记-清除算法


  1. 标记清除算法,顾名思义就是先标记,再清除,是最基础的一种垃圾回收算法,先标记就是说先把内存区域里的可回收的对象标记出来,然后把这些垃圾清除掉。就会腾出一片内存区域来,等待再次被使用,但是这样存在一个问题,就是内存碎片
  2. 由于垃圾回收掉的区域并非是连续的内存空间,所以会有大小不一的内存碎片,那么现在如果有一个比较大的对象需要存储,但是内存碎片并不够大的话,就会导致空有内存空间,但是却用不了。

(2)Copying 复制算法


为了优化标记清除算法的弊端,复制算法优化了内存碎片的问题。
复制算法是在标记清除算法的基础上演化而来,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。保证了内存的连续可用,内存分配时也就不用考虑内存碎片等复杂情况。但是这种方式,内存的代价太高,每次基本上都要浪费一半的内存。


(3)Mark-Compact 标记-压缩算法


标记-压缩算法标记过程仍然与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,再清理掉端边界以外的内存区域。

标记压缩算法解决了内存碎片的问题,也规避了复制算法只能利用一半内存区域的弊端。标记压缩算法对内存变动更频繁,需要整理所有存活对象的引用地址,在效率上比复制算法要差很多。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。


(4)Generational Collection 分代收集算法


分代收集算法分代收集算法严格来说并不是一种思想或理论,而是融合上述3种基础的算法思想,而产生的针对不同情况所采用不同算法的一套组合拳,根据对象存活周期的不同将内存划分为几块。

在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

在老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理算法或者标记-整理算法来进行回收。

这个后面会提到堆的分代以及对应的算法
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
3年前
CMS垃圾回收过程
1.总体介绍:CMS(ConcurrentMarkSweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上\XX:UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。2.CMS
Wesley13 Wesley13
3年前
Java虚拟机调优系列PDF免费下载
1、目录Java虚拟机调优系列整理了下,导出成pdf了,方便朋友们查看,以下是目录:(1)Java虚拟机调优(一)一些概念(2)Java虚拟机调优(二)一些概念(续)(3)Java虚拟机调优(三)基本垃圾回收算法(4)Java虚拟机调优(四)垃圾回收面临的问题(5)Java虚拟机调优(五)分代垃圾回收详述1(6)Jav
Stella981 Stella981
3年前
JVM系列篇:7种JVM垃圾收集器特点,优劣势、及使用场景
本系列会持续更新。!(https://oscimg.oschina.net/oscnet/945dbe48630eb4284fea936b19161c0f08a.jpg)今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。一、常见的垃圾收集器
Wesley13 Wesley13
3年前
JVM垃圾回收器
1,先贴上4中回收器的参数:\XX:UseSerialGC串行垃圾回收器\XX:UseParallelGC并行垃圾回收器\XX:UseConcMarkSweepGC并发标记扫描垃圾回收器\XX:UseG1GCG1垃圾回收器2,分别测试每种参数1默认的情况是(XX:UseSerialGC),即使不
Stella981 Stella981
3年前
Python垃圾回收机制
对于Python垃圾回收机制主要有三个,首先是使用引用计数来跟踪和回收垃圾,为了解决循环引用问题,就采用标记清除的方法,标记清除的方法所带来的额外操作实际上与系统中总的内存块的总数是相关的,当需要回收的内存块越多,垃圾检查带来的额外操作就越多,为了提高垃圾收集的效率,采用“空间换时间的策略”,即使用分代机制,对于长时间没有被回收的内存就
Stella981 Stella981
3年前
JVM调优总结(三)
可以从不同的的角度去划分垃圾回收算法:按照基本回收策略分引用计数(ReferenceCounting):比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。标记清除(MarkSweep):
Stella981 Stella981
3年前
JVM架构体系与GC命令小总结
!(https://oscimg.oschina.net/oscnet/052a011b9ad19376d76daa6b6dcb82fa032.png)1.Overview2.JVM架构体系1)垃圾回收对象存活性判断垃圾回收算法垃圾回收器(回收算法的具体实现)
Stella981 Stella981
3年前
JVM的GC算法总结
Java程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经失去标记,程序用不了它们了,对程序而言它们已经废弃),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC),这就是我们的垃圾回收机制,关于垃圾回收我总结了一下几种:标记–清除算法(MarkSweep)