常用垃圾回收算法
过程:扫描一遍堆内存,对要清除的对象进行标记,扫描完成之后会一起清除
速度非常快,缺点是会产生大量的空间碎片
过程:先将内存区域分成左右两块,右边一块空着,左边来存放对象。在回收的时候,会扫描左边的那一块空间,将要保留的对象复制到右边存储下来,这个存储是有顺序并且排列整齐的,然后清除掉左边区域。
速度慢并且浪费了一半的空间,但是不会产生空间碎片
过程:遍历GC Roots,将要保留的对象标记,移动所有需要保留的对象,按照内存地址有序排列。然后将其他区域全部回收。
不会产生空间碎片,也不会浪费内存空间,但是非常耗时
垃圾回收器
新生代回收器:Serial、parNew、Parallel Scanvage
老年代回收器:CMS、Serial Old、Parallel Old
整堆回收器:G1
最古老的回收器,是单线程的,在单CPU环境下性能很好。使用的算法是复制算法。
Serial回收器的老年代版本,采用的是整理算法,同样是单线程的
Serial的多线程版本。新生代采用复制算法,老年代采用整理算法
Parallel Scanvage和parNew 都是多线程的。Parallel注重吞吐量,GC停顿时间的缩短要以吞吐量作为代价,因此该回收器的最大缺点就是停顿时间大
采用的是复制算法
老年代版本,采用整理算法
注重停顿时间,使用Serial Old来整理内存
过程:初始标记(直接对象,stop the world) ——> 并发标记(可达性)——> 重新标记(并发期间用户产生的垃圾,stop the world)——> 并发清除
缺点:无法清除浮动垃圾、产生大量空间碎片、对CPU资源很敏感(要分出运算能力执行回收器)
兼顾吞吐量和停顿时间的回收器。存在年代的概念,内存结构类似于棋盘,采用的是复制算法,整体上看作是标记-整理算法,可以避免产生大量空间碎片
过程:初始标记(直接关联对象,stop the world) ——> 并发标记(可达性)——> 重新标记(并发期间用户产生的垃圾、stop the world)——> 筛选回收(对各个区域的回收价值和成本进行排序,根据用户所期望的GC停顿时间来选择性回收)