垃圾回收器(上)

目前,还没有一种最好的收集器,只是我们可以对具体的应用可以找到最合适的收集器,在新生代中使用复制算法,在老年代中使用标记-整理算法

一 Serial收集器(单线程)

1 该收集器是最基本的,发展历史最悠久的收集器,存在于新生代中。

2 该收集器有一个弊端,就是在进行垃圾收集的时候,必须暂停其他所有的工作线程,直到它收集结束,这就导致用户体验很差

3 到现在为止Serial依然是虚拟机运行在Client模式下的默认新生代收集器。该收集器的优点是:

  • 简单而高效:由于Serial收集器没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率

二 ParNew收集器(多线程)

1 它也是一个新生代收集器,与Serial的区别在于使用多线程进行垃圾回收,其他行为都与Serial收集器完全一样,实际上,两种收集器也共用了相当多的代码

2 ParNew收集器是许多运行在Server模式下的虚拟机首选的新生代收集器

3 ParNew收集器可以与老年代的CMS配合使用

4 ParNew收集器默认开启的收集线程数与CPU数量相同

5 并行:指的是多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态

   并发:指的是用户线程与垃圾收集线程同时执行,用户程序在继续执行,而垃圾收集程序运行在另一个CPU上

三 Parallel Scavenge收集器

1 它也是一个新生代收集器,他的特别之处在于:Parallel Scavenge的目标是达到一个可控制的吞吐量

  • 吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)

2 停顿时间越短越适合需要与用户交互的程序,良好的相应速度能提升用户的体验;而高吞吐量则可以高效率地利用CPU的时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务

3 GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的(系统把新生代调小一些,收集300MB新生代肯定比收集500MB速度快,这也导致垃圾收集发生的更频繁一些,虽然停顿时间在下降,但是吞吐量却下降了)

4 Parallel Scavenge 收集器也被称为“吞吐量优先”收集器

5 Parallel Scavenge通过设定参数可以实现GC的自适应调节

四 Serial Old收集器

1 它是Serial收集器的老年代版本,是一个单线程收集器,使用标记-整理算法

2 这个收集器的主要意义在于给Client模式下的虚拟机

五 Parallel Old收集器

1 Parallel Old是Parallel Scavenge的老年代版本,使用多线程和标记-整理算法

2 在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器

六 CMS收集器

1 该收集器的目的是获得最短回收停顿时间,基于“标记-清除”算法

2 运作过程分为四步

  • 初始标记:仅仅是标记一下GC Roots能直接关联到的对象,速度很快
  • 并发标记:进行GC Roots Tracing的过程
  • 重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
  • 并发清除

整个过程中耗时最长的并发标记并发清除过程收集器线程都可以与用户线程一起工作,所以,从整体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

3 CMS收集器的优点从名字上可以体现出来:并发低停顿收集器,缺点如下:

  • CMS收集器对CPU资源非常敏感
  • CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生
  • 用于CMS是基于“标记-清除”算法实现的收集器,所以收集结束时会有大量空间碎片,不利于大对象的分配

猜你喜欢

转载自blog.csdn.net/wo8vqj68/article/details/81232476
今日推荐