1.垃圾回收器(GC)算法的前世今生
1.1 Mark-Sweep算法:
Mark-Sweep算法,也称为:标记-清除法,这是最基本的垃圾回收器算法,过程如下:
Mark-Sweep分为:标记阶段和清除阶段
标记要回收的对象,清除回收被标记所占的空间
PS:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
|
1.2 Copying算法(复制算法):
上面说了Mark-Sweep算法,有很大的问题,所以,算法不停的改进,产生了Copying算法,具体情况如下:
① 将内存分为大小相等的两块,每次只使用一块
② 将活着的对象复制到另一块上,使用的清除掉
PS:不容易产生内存碎片,但是内存会缩减到以前的一半,如果存活对象多,效率会很低,所以可以于新区的时候。
|
1.3 Mark-Compact算法(标记整理算法):
为了解决,空间浪费的问题,算法继续改进,Mark-Compact算法问世,具体情况如下:
标记阶段和Mark-Sweep一样
完成标记后,不直接清除回收对象,将对象移向一段
清理边界内存
ps:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
|
1.4 Generational Collection算法
分代收集算法,听名字就知道,因为我们根据存活的生命周期分为了:新生代,老年代和永久代,具体情况如下:
• 根据存活的生命周期将内存分为若干个区:新生代和老年代和永久代
• 新生代:每次都回收大量对象——>Copying复制法
• 老年代:每次都回收少量对象——>Mark-Compact法
• 永久代:存储class类,常量,方法描述:回收废弃常量和无用类
• 分代收集法:也就是Jvm的垃圾回收所使用的算法,这种算法,既提高了内存空间的使用,而且根据各代的特点,针对处理,减少了cpu的使用率,提高了性能。