博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java gc回收区域_Java垃圾回收机制(GC)—怎么回收垃圾(内存)?
阅读量:5742 次
发布时间:2019-06-18

本文共 1391 字,大约阅读时间需要 4 分钟。

Java垃圾回收机制提供了一些算法来回收垃圾对象内存:

Tracing算法(Tracing Collector)或标记-清除算法

标记-清除算法是最基础的收集算法,为了解决引用计数法的问题而提出的。它使用了根集的概念,它分为“标记”和“清除”两个阶段:首先标记出所需回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实就是对前面的根搜索算法中判定垃圾对象的标记过程。

优点:不需要进行对象的移动,并且仅对不存活的对象进行处理,在存活对象比较多的情况极为有效。

缺点:(1)标记和清除过程的效率都不高。(这种方法需要使用一个空闲列表来记录所有的空闲区域以及大小。对空闲列表的管理会增加分配对象时的工作量。如图1所示。)。

(2)标记清除后会产生大量不连续的内存碎片。虽然空闲区域的大小是足够的,但却可能没有一个单一区域能够满足这次分配所需的大小,因此本次分配还是会失败(Java中就是一次OutOfMe moryError)不得不触发另一次垃圾收集动作。如图2所示。

761738f36ca285bdc06263b6d166a6e5.png

图1 标记-清除算法

71c27c3c86dc3a53b2fb5a9c1e2f30af.png

图2 标记-清除算法

Compacting算法(Compacting Collector)或标记-整理算法

该算法标记的过程与标记-清除算法中的标记过程一样,但对标记后的垃圾对象的处理情况有所不同,它不是直接对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。在基于Compacting算法的收集器中的实现中,一般增加句柄和句柄表。

优点:(1)经过整理之后,新对象的分配只需要通过指针碰撞便能完成(Pointer Bumping),相当简单。(2)使用这种方法空闲区域的位置始终可知的,也不会有碎片的问题了。

缺点:GC暂停的时间会增长,因为你需要将所有的对象都拷贝到一个新的地方,还得更新它们的引用地址。

c93d96b0ca30a4324be0da0e14110605.png

图3 标记-整理算法

b4b934935e3ab851a903d8ba44350a75.png

图4 标记-整理算法

Copying算法(Copying Collector)

该算法的提出是为了克服句柄的开销和解决碎片的垃圾回收。它将内存按容量分为大小相等的两块,每次只使用其中的一块(对象面),当这一块的内存使用完了,就将还存活的对象复制到另外一块内存上面(空闲面),然后再把已使用过的内存空间一次清理掉。

复制算法比较适合于新生代(短生存期的对象),在老年代(长生存期的对象)中,对象存活率比较高,如果执行较多的复制操作,效率将会变低,所以老年代一般会选用其它算法,如标记-整理算法。一种典型的基于Copying算法的垃圾回收是stop-and-copy算法,它将堆分成对象区和空闲区,在对象区和空闲区的切换过程中,程序暂停执行。

优点:(1)标记阶段和复制阶段可以同时进行。(2)每次只对一块内存进行回收,运行高效。(3)只需移动栈顶指针,按顺序分配内存即可,实现简单。(4)内存回收时不用考虑内存碎片的出现(活动对象之间所占的内存空间之间没有空闲间隔)。

缺点:需要一块能容纳下所有存活对象的额外的内存空间。因此,可一次性分配的最大内存缩小了一半。

4ac852a6ebb224b1bfed0b49cfc7cdaa.png

图5 Copying算法

11388d585964bc90d9a81a04f9317017.png

图6 Copying算法

Adaptive算法(Adaptive Collector)

在特定情况下,一些垃圾收集算法会优于其它算法。基于Adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。

转载地址:http://tfnzx.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
Windows Phone 7 隔离存储空间资源管理器
查看>>
Microsoft Excel 2000/2003修复工具
查看>>
apache安装报错undefined reference ssl
查看>>
关于爱情只有一句忠告
查看>>
CentOS 7下安装部署Oracle11g图文教程
查看>>
F#初学笔记06
查看>>
实战:将企业域名解析委派给企业DNS服务器
查看>>
在Lync 2013环境部署Office Web Apps
查看>>
微软大会Ignite,你准备好了么?
查看>>
读书笔记-高标管事 低调管人
查看>>
Master带给世界的思考:是“失控”还是进化
查看>>
用户和开发者不满苹果iCloud问题多多
查看>>
attrs.xml中declare-styleable 详解(用于自定义控件的属性)
查看>>
java.lang.UnsatisfiedLinkError:no dll in java.library.path终极解决之道
查看>>
我的工具:文本转音频文件
查看>>
【许晓笛】从零开始运行EOS系统
查看>>
【跃迁之路】【460天】程序员高效学习方法论探索系列(实验阶段217-2018.05.11)...
查看>>
C++入门读物推荐
查看>>
TiDB 源码阅读系列文章(七)基于规则的优化
查看>>