Java垃圾回收算法浅析

2019-05-28  本文已影响0人  秦淮河的桨

最近在看《深入理解Java虚拟机》一书,其中对垃圾回收算法做了分类和讲解,这里记录一下。

https://foreti.me/2017/12/31/java-gc-algorithm/


GC的三种收集方法

标记清除

标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想。

标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象。

vern标记清除算法

主要缺点:

  1. 效率问题,标记和清除过程效率不高 。
  2. 空间问题,标记清除之后会产生大量不连续的内存碎片。

标记整理

标记整理,主要用于回收老年代。

标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有存活的对象都向一端移动,并更新引用其对象的指针。

vern标记整理算法

主要缺点:在标记-清除的基础上还需进行对象的移动,成本相对较高,好处则是不会产生内存碎片。

复制算法

复制算法,主要用于回收新生代。

它将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块用完之后,就将还存活的对象复制到另外一块上面,然后在把已使用过的内存空间一次理掉。这样使得每次都是对其中的一块进行内存回收,不会产生碎片等情况,只要移动堆订的指针,按顺序分配内存即可,实现简单,运行高效。

[图片上传失败...(image-b91d98-1558977911608)]

主要缺点:内存缩小为原来的一半。

分代的垃圾回收策略

分代的垃圾回收策略是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。

年轻代(Young Generation)

年老代(Old Generation)

持久代(Permanent Generation)

用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

Oracle JDK8的HotSpot VM去掉“持久代”,以“元数据区”(Metaspace)替代之。


<p id="div-border-left-red"><i>DigitalOcean 优惠码,注册充值 5 送100,链接一 链接二</i></p>
<p id="div-border-left-red"><i>Lastly, welcome to follow me on github</i></p>

上一篇 下一篇

猜你喜欢

热点阅读