java 垃圾收集器

目录

1.  新生代垃圾收集器

1.1 Serial收集器

1.2 ParNew 收集器

1.3 Parallel Scavenge 收集器

2. 老年代垃圾收集器

2.1 Serial Old 收集器

2.2 Parallel Old 收集器

2.3 CMS收集器

3. G1收集器


由于目前商业虚拟机采用的回收算法是“分代收集”算法,所以将虚拟机内存分为3种:新生代、老年代、永久代。 堆被划分为新生代和老年代,方法区就是永久代。永久代的回收算法基本没怎么变,还是那样,但是对于新生代和老年代,发展出了很多的垃圾收集器(Garbage Collection, 简称GC),现在总算明白了,虚拟机内存的垃圾回收是由多个GC一起协作完成的。新生代用复制算法,老年代用标记——整理算法,针对新生代和老年代,下面介绍7中垃圾回收器:

有连线的两个垃圾收集器可以搭配使用,这些GC各有优势,不是说谁最好,所以根据自己的应用需求,为虚拟机选择合适的GC搭配是最好的。

1.  新生代垃圾收集器

1.1 Serial收集器

Serial垃圾收集器是个单线程收集器,在它收集垃圾的时候,虚拟机必须暂停所有其他的工作线程(这些工作线程只是虚拟机能管理的java线程)。下图进行了说明,只要Serial垃圾收集器线程执行,其他的线程就得暂停。

优点:简单而高效(与其他收集器的单线程比),依然是虚拟机运行在Client模式下的默认新生代收集器,虽然会有停顿,但是在用户桌面应用场景中,分配给虚拟机管理的内存一般来说不会很大,收集几十兆甚至一两百兆的新生代,停顿时间完全可以控制在几十毫秒,最多几百毫秒以内,只要不频繁发送垃圾回收,这点停顿是可以接受的(要求不高的话)。

缺点:当垃圾回收执行时,其它的线程需要暂停。

1.2 ParNew 收集器

ParNew收集器其实就是Serial收集器的多线程版本。

优点:是很多运行在Server模式下的虚拟机中的首选新生代收集器,除了Serial收集器外,目前只有它能与CMS收集器配合,并且是多线程的,在多CPU环境下能够很好地利用资源。

缺点:因为有线程交互开销,在单CPU,运行效果肯定不如Serial,在双CPU情况下,运行效果未必就比Serial好。

1.3 Parallel Scavenge 收集器

Parallel Scavenge收集器是新生代并行的多线程收集器,追求高吞吐量,高效利用 CPU。

该收集器的目标是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即 吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

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

Parallel Scavenge 收集器在执行垃圾回收的时候,其它线程也要暂停。

为什么说它能让吞吐量可控呢?归功于两个参数:最大垃圾收集停顿时间、用户代码运行时间参数。 用户代码运行时间参数:GC收集时间按1算,如果用户代码运行时间参数是19,那么吞吐量=19/19+1 = 95%。

Parallel Scavenge 收集器会自动根据当前运行情况调整两个参数,将吞吐量控制住,这是自动调节的,也是Parallel  Scavenge的优势。

2. 老年代垃圾收集器

2.1 Serial Old 收集器

Serial Old是Serial收集器的老年代版本,单线程,使用“标记——整理”算法,与Serial收集器基本一样,主要就是回收算法不同。主要意义也是在Client模式下使用。

当Serial Old执行时,其它线程也要暂停。

2.2 Parallel Old 收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法,在JDK1.6中才出现。当Parallel Old执行时,其它线程要暂停。

2.3 CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,适合那些重视服务的响应速度的应用。使用“标记——清除”算法。

优点:并发收集、低停顿。

缺点:CMS收集器对CPU资源非常敏感。CPU个数少于4个时,CMS对于用户程序的影响就可能变得很大;

            CMS收集器无法处理浮动垃圾,因为并发清理阶段用户线程还在运行,这段时间就可能产生新的垃圾,新的垃圾在此次GC无法清除,只能等到下次清理,这些垃圾就叫浮动垃圾。

            CMS是基于“标记-清除”算法实现的收集器,手机结束时会有大量空间碎片产生。

3. G1收集器

G1是最新的垃圾收集器,对新生代和老年代都进行垃圾回收,它比CMS有两个显著的改进:G1使用“标记——整理”算法,不会产生空间碎片,这对于长时间运行的应用来说非常重要;G1可以非常精准地控制停顿时间。

G1将整个java堆(包括新生代、老年代)划分为多个大小固定的独立区域,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先级列表,每次根据允许的收集时间,优先回收垃圾最多的区域。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值