简介
垃圾收集器是垃圾收集算法的具体实现,各种垃圾收集器没有好坏之分,适合自己当前应用的垃圾收集器才是最好的垃圾收集器,用户可以根据自己应用的特点和要求组合出各个年代所使用的垃圾收集器。
垃圾收集器种类以及简单介绍:
- Serial:单线程收集器,新生代,采用复制算法进行垃圾回收。它只会使用一条收集线程去完成垃圾收集工作,还必须暂停其它所有的工作线程(Stop The World),由虚拟机在后台自动发起和自动完成。
- ParNew:多线程版本的Serial收集器,新生代,采用复制算法进行垃圾回收。和Serial相比,它会使用多条收集线程进行收集工作,而且在老年代使用CMS收集器的时候,新生代除了Serial收集器,只有该收集器才能配合使用。在单CPU的情况下,ParNew收集器不会比Serial收集器的性能更好。
- Paraller Scavenge:吞吐量优先垃圾收集器,和ParNew差不多,新生代,采用复制算法进行垃圾回收。PS收集器的目标是达到一个可控制的吞吐量,所谓吞吐量是CPU用于运行用户代码的时间和CPU总消耗时间的比值。适合后台运算而不需要太多交互的任务。
- Serial Old:单线程收集器,老年代,采用标记-整理算法进行垃圾回收。一种用途是和新生代的PS收集器配合使用,第二种用途是作为后备元,在CMS收集器发生concurrent mode failure时使用。
- Parallel Old:吞吐量优先垃圾收集器,老年代,采用标记-整理算法进行垃圾回收。PS收集器的老年代版本,和PS收集器配合使用
- CMS:concurrent mark sweep并发标记-清楚收集器,老年代,采用标记-清除算法进行垃圾回收。重视响应速度,目标使系统停顿时间最短,在重视服务的响应速度的应用中使用。
-
G1:garbage first优先回收价值最大的Region,这里价值最大Region的意思是指回收获得的空间大并且回收所需时间更短的Region。它把整个堆作为一个整体来进行独立管理,将堆空间分成一个个大小相等独立的Region,也有新生代、老年代和永久代的概念。采用标记-整理算法进行垃圾回收。
相关概念解释:
1. 并行:是指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
2. 并发:是指用户线程和垃圾收集线程同时进行工作,用户线程继续运行,而垃圾收集线程此时运行在另一个CPU上。
3. 浮动垃圾:在CMS垃圾收集器中,在并发清除阶段由于用户线程也在运行,此时会产生新的垃圾,CMS此次无法处理只能在下一次GC时回收,这一部分垃圾就被称为浮动垃圾
4. concurrent mode failure:因为并发收集时,用户线程也在运行,因此需要预留一部分空间提供给用户线程在并发收集时使用,在这个时候预留空间不足时就会出现concurrent mode failure失败。
CMS收集器工作流程:
- 初始标记:发生STW,标记GC Roots能直接关联到的对象。
- 并发标记:用户线程也在并行执行,耗时长,这个阶段进行GC Roots tracing的过程。
- 重新标记:发生STW,为了修正在并发标记阶段由于用户线程继续运行而导致标记变动的那部分对象的记录。
- 并发清除:用户线程也在并行执行,耗时长,这个阶段进行对象空间的清除。
CMS收集器的缺点:
- 对CPU资源比较敏感:在并发阶段由于和用户线程并发执行会占用用户线程的线程资源,会导致用户程序变慢。
- 会产生浮动垃圾:在并发清除阶段由于用户线程的并发执行会产生产生浮动垃圾,在运行期间预留内存空间不足时会发生concurrent mode failure,进而临时启用Serial Old收集器来进行工作,这样导致停顿时间变长。
- 产生碎片空间:由于CMS采用的是标记-清除算法,在收集结束后会产生大量的碎片空间,会给大对象分配带来麻烦,因此会触发Full GC。