一、GC的常见算法
- Mark-Sweep(标记清除算法)
该算法适合存活对象较多,可回收对象较少的场景。执行过程是需要进行两遍的扫描,第一遍定位出非垃圾对象,第二遍扫描是将垃圾对象进行清理,执行效率相对偏低,并且容易产生碎片。
- Copying(复制算法)
该算法适合存活对象较少的时候,将内存一分为二,每次回收都将非垃圾对象的从前一半内存拷贝的另一半内存中。整个过程只扫描一次,不会产生碎片,但是存在空间的浪费,因为只有一半的内存进行对象分配。
- Mark-Compact(标记整理算法)
在回收垃圾对象的时候同时进行整理的算法。同样需要进行两次扫描,第一次定位非垃圾对象,第二遍进行非垃圾对象的移动和整理。有点是不会产生碎片,内存利用率高,不像复制算法只利用了一半的内存。
二、GC算法示意图
红色:垃圾对象
绿色:非垃圾对象
白色:可用内存
三、垃圾收集器
垃圾收集器其实就是不同的垃圾回收算法的具体实现,针对不同的场景,不同的垃圾收集器有自己适用场景。纠正一下图中,jdk8默认的垃圾回收器是ps+po(parallel scavenge和parallel old)。
四、垃圾收集器的发展历程
JDK最开始时候年轻代垃圾收集器是Serial,对应老年代是Serial Old;
因为这两者都是单线程的,所以为了收集效率,出现了使用多线程并行回收的年轻代的Parallel Scavenge和老年代的Parallel Old;后来CMS作为一个老年代收集器,几乎可以认为垃圾回收线程和用户线程是同时进行的,因此响应时间非常短,和它配套,诞生了ParNew这个年轻代的收集器,它可以认为是Parallel Scavenge的增强版。再往后就是G1垃圾收集器、ZGC垃圾回收器了。
网友评论