GC和GC算法
gc的作用在堆和方法区,分为轻GC和重GC。不详细划分的话,方法区算是堆的一部分,也可以说GC主要作用于堆。
那么,就需要回顾一下堆的知识了,
堆分为如下三个区域
- 新生代(伊甸园 Eden)
- 幸存区(form/0,to/1)
- 老年区
- 永久储存区
GC会对伊甸园区和幸存者区进行清理,通常来说,大多数对象都会在伊甸园区被清理殆尽,存活下来的对象会进入幸存者区。而未被设置的情况下,在15次清理交换后仍旧存活下来的对象会被放到老年区。
当然,我们可以手动设置对象在幸存区经历清理的次数
下面,我将着重介绍下GC的一些算法。
1.引用计数器法
如上所示,我们使用一个计数器来记录每个对象的使用次数,次数多的对象留下,次数少的对象被清除。
这种算法存在浪费资源,清理不完全等许多毛病,现在已经较少投入使用。
2.复制算法
复制算法体现在幸存区之间的不断交换,在复制算法中,幸存的对象会不断从from运动到to区,然后原from区空了,变为to区,原to区变成from区,以此往复循环清理。
- 好处:没有内存的碎片
- 坏处:浪费了内存空间 :多了一半空间永远是空to。假设对象100%存活(极端情况)
复制算法最佳使用场景:对象存活度较低的时候;新生区好处:没有内存的碎片
3.标记清除算法
就像上面那样,放入JVM里的部分对象被标记,被标记的对象不会被GC清楚,而未被标记的对象会被GC清除,以此来达到回收垃圾的效果。
优点:不需要额外的空间
缺点:两次扫描,严重浪费时间,会产生内存碎片。
4.标记清除压缩算法
所谓标记清除压缩算法指的就是,在标记清楚的基础上对清楚后的对象进行整理,使其按顺序排列。
一般来讲,GC清理5次后进行一次剩余对象的压缩。