这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
四大引用
JDK1.2 之后,Java对应用进行了扩充,将引用分为强引用,软引用,弱引用,虚引用,四种引用强度依次减弱
强引用
最传统的引用,指代码中普遍存在的引用赋值 Object o = new Object().
这种情况下,只要强引用关系还存在,永远不会回收!
软引用
用来描述一些还有用,但非必须的对象。
这种关系下,当系统将要内存溢出,会将这些对象列入回收范围中进行第二次回收。如果回收后内存还是溢出,才会跑出内存溢出异常。
JDK1.2 提供SoftReference类实现软引用。
弱引用
也描述非必须对象,但是强度比软引用更弱一些。这种对象只能存活到下次垃圾回收发生为止。当垃圾回收开始工作,无论内存是否足够,都会回收。
WeakReference类
虚引用
最弱的一种引用关系。对象是否用虚引用不会对其生存时间产生影响,也无法通过虚引用生成对象实例。只用于对象回收时受到系统通知。
PhantomReference类
垃圾算法
这里所谓的清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里。
Mark-Sweep (标记清除)
标记出垃圾之后清除
缺点:位置不连续,产生碎片
Copying(拷贝)
应用场景
用于新生代,高效性是建立在存活对象少、垃圾对象多的前提下的
过程
将活着的内存空间分为两块,每次只使用其中一块,将随机分布的正在引用的内存地址拷贝到连续的内存空间中,然后将之前的随机内存地址全部清空
所以采用的是指针碰撞
优点:没有碎片,速度快
缺点:浪费空间,内存是能使用一半
Mark-Comapct(标记压缩)
应用场景
用于老年代
过程
1.标记出所有垃圾
2.将其他的正在引用的内存地址拷贝到这个垃圾分类地址上,形成连续的正在引用内存地址。
优点: 集合了标记清楚和拷贝的优点
缺点:效率比较拷贝算法低
| Mark-Sweep | Mark-Compact | Copying | |
|---|---|---|---|
| 速度快慢 | 中等 | 最慢 | 最快 |
| 空间开销 | 少(会堆积碎片) | 少(不堆积碎片) | 通常需要活对象的2倍大小(不堆积碎片) |
| 移动对象 | 否 | 是 | 是 |
Generational Collection(分代收集)算法
是目前大部分JVM的垃圾收集器采用的算法。将垃圾区域分成老年代和新生代。
- 特点
老年代的特点是回收时只有少量垃圾需要回收,新生代时有大量垃圾需要回收
- 区域使用的算法
老年代使用标记压缩算法
新生代使用复制算法