jvm-gc垃圾算法

72 阅读3分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

四大引用

JDK1.2 之后,Java对应用进行了扩充,将引用分为强引用,软引用,弱引用,虚引用,四种引用强度依次减弱

强引用

最传统的引用,指代码中普遍存在的引用赋值 Object o = new Object().

这种情况下,只要强引用关系还存在,永远不会回收!

软引用

用来描述一些还有用,但非必须的对象

这种关系下,当系统将要内存溢出,会将这些对象列入回收范围中进行第二次回收。如果回收后内存还是溢出,才会跑出内存溢出异常。

JDK1.2 提供SoftReference类实现软引用。

弱引用

也描述非必须对象,但是强度比软引用更弱一些。这种对象只能存活到下次垃圾回收发生为止。当垃圾回收开始工作,无论内存是否足够,都会回收

WeakReference类

虚引用

最弱的一种引用关系。对象是否用虚引用不会对其生存时间产生影响,也无法通过虚引用生成对象实例。只用于对象回收时受到系统通知

PhantomReference类

垃圾算法

这里所谓的清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里。

Mark-Sweep (标记清除)

标记出垃圾之后清除

缺点:位置不连续,产生碎片

Copying(拷贝)

应用场景

用于新生代高效性是建立在存活对象少、垃圾对象多的前提下的

过程

将活着的内存空间分为两块,每次只使用其中一块,将随机分布的正在引用的内存地址拷贝到连续的内存空间中,然后将之前的随机内存地址全部清空

所以采用的是指针碰撞

优点:没有碎片,速度快

缺点:浪费空间,内存是能使用一半

Mark-Comapct(标记压缩)

应用场景

用于老年代

过程

1.标记出所有垃圾

2.将其他的正在引用的内存地址拷贝到这个垃圾分类地址上,形成连续的正在引用内存地址。

优点: 集合了标记清楚和拷贝的优点

缺点:效率比较拷贝算法低

Mark-SweepMark-CompactCopying
速度快慢中等最慢最快
空间开销少(会堆积碎片)少(不堆积碎片)通常需要活对象的2倍大小(不堆积碎片)
移动对象

Generational Collection(分代收集)算法

是目前大部分JVM的垃圾收集器采用的算法。将垃圾区域分成老年代和新生代。

  • 特点

老年代的特点是回收时只有少量垃圾需要回收,新生代时有大量垃圾需要回收

  • 区域使用的算法

老年代使用标记压缩算法

新生代使用复制算法