您的位置:首页 > 其它

JVM垃圾收集器

2017-04-24 15:34 190 查看
Serial收集器
虚拟机client模式下新生代的默认回收器,单线程进行垃圾收集,并且在其进行垃圾收集时,必须暂停其它所有工作线程,直到垃圾收集结束,这一过程(stop the world)由虚拟机在后台自动发起自动完成,会在用户不可见的条件下把用户所有正常工作线程全部停掉。当然如果停顿的时间很短是可以接受的,但是如果每次停顿5分钟,任何人都会崩溃

ParNew收集器(主要使用)
新生代收集器,使用复制算法

Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为与Serial收集器完全一样,依然会stop the world

主要用于在server模式下回收新生代内存,主要原因是CMS收集器(老年代收集器)只能与Serial收集器或者ParNew收集器配合使用
默认开启的回收线程数与CPU个数相同(现代服务器动辄32个逻辑CPU将会导致ParNew收集器开启32个收集线程,这种情况下最好限制下收集线程个数),通过

-XX:ParallelGCThreads=value用于指定ParNew开启的垃圾收集线程数

-XX:+UseConcMarkSweepGC (指定CMS收集器)和-XX:+UseParNewGC (指定ParNew收集器)jvm参数需同时配置

CMS(Concurrent Mark Sweep)收集器(主要使用)

老年代收集器,使用标记-清除算法,多线程并发收集器,以达到最短的垃圾收集挺停顿时间为目标的收集器

该收集器的收集过程分为4个步骤:

1,初始标记 CMS initial mark:该步会stop the world,但耗时非常短,标记GC Root直接关联的对象

2,并发标记 CMS concurrent mark:耗时较长,用户线程可同时运行,标记至GC Root有可达路径的对象

3,重新标记 CMS remark:该步会stop the world,但耗时非常短。由于步骤2中用户线程会同步运行,此时主要修正因步骤2中用户线程同步运行产生的对象标记变动

4,并发清除 CMS concurrent sweep:耗时较长,用户线程可同时运行

优点:

在耗时很长的并发标记阶段和并发清除阶段用户线程和收集线程都可同时工作,故而总体上来说,CMS收集器的内存回收是与用户线程一起并发执行的,CMS GC的特点体现在并发收集、低停顿

虽然收集停顿时间短,但是也有不少缺点:

1,对CPU资源敏感,CMS收集器默认开启的收集线程数为(CPU数量+3)/4,如果CPU数量较少,会占用不少CPU处理资源

2,无法处理浮动垃圾,并且可能产生Concurrent Mode Failure从而导致另一次Full GC。

并发清除时(步骤4),用户线程是可以同时运行的,此时用户线程会产生新的垃圾,这部分垃圾在标记过程之后产生,本次GC已经不能进行标记后清除,只能留到下次GC时处理,被称为浮动垃圾

由于CMS的收集线程执行时,用户线程也是会同时执行的,导致CMS收集器无法像其它老年代收集器那样在老年代内存几乎耗尽时再进行GC,必须为用户线程预留部分内存(低版本JDK默认值为68%,JDK6及以上版本默认值为92%将),如果预留内存无法满足用户线程的执行,将会出现Concurrent Mode Failure,此时虚拟机将会启动备用方案,调用Serial Old收集器执行一次Full GC,这将导致较长的收集停顿

3、CMS GC是基于标记-清除算法,每次GC结束会产生大量内存空间碎片,内存空间碎片过多时,将导致没有连续的内存空间分配给大对象,这样会导致Full GC提前被触发一次,虚拟机提供

-XX:+CMSFullGCBeforeCompaction=0(设置进行完几次不进行压缩的Full GC后,进行一次附带压缩的Full GC,仅对CMS收集器生效)参数进行设置

Parallel Scavenge收集器
新生代收集器,使用复制算法,多线程收集器

该收集器的关注点与其它收集器的关注点不同,其它收集器的目标为尽可能缩短垃圾收集时用户线程的停顿时间,该收集器的目标为达到一个可控的吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾回收时间)

停顿时间短则响应速度快,适合与用户交互比较多的应用;吞吐量大能够最高效的利用CPU时间,尽快完成运算任务,适合后台运算、交互不多的应用

-XX:MaxGCPauseMillis =100(单位:ms)最大停顿时间,仅对Parallel Scavenge收集器生效

-XX:GCTimeRatio 吞吐量大小,默认值为99,即1%的GC时间,仅对Parallel Scavenge收集器生效

-XX:+UseAdaptiveSizePolicy 使用GC自适应调节策略,如果启用该策略,只需要设置好基本参数(-Xmx等),然后设置一个优化目标(最大停顿时间或吞吐量大小),虚拟机会根据当前系统的运行状况收集性能监控信息,动态调整细节参数设置以提供最合适的停顿时间和最大吞吐量

Serial Old收集器

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

作为CMS收集器的后备收集器:当CMS收集器产生Concurrent Mode Failure时,将临时启动Serial Old收集器重新进行老年代的垃圾收集

Parallel Old收集器

老年代收集器,使用标记-整理算法,多线程收集器,JDK1.6提供,Parallel Scavenge收集器的老年代版本

G1(Garbage First)收集器

基于标记-整理算法实现的收集器,JDK从1.7版本开始提供该收集器

G1收集器并不采用新生代和老年代物理隔离的传统布局方式(仅在逻辑上划分新生代和老年代),而是将整个堆内存划分为2048个大小相同的独立Region块,每个Region块的大小根据堆的实际大小而定,整体被控制在1M-32M之间,G1收集器跟踪Region中的垃圾堆积情况并在后台维护一个优先级列表,每次根据设置的垃圾回收时间回收优先级最高的区域,这样可以避免整个新生代或整个老年代的垃圾回收,使得stop the world的时间更短、更可控,同时在有限的时间内可以获得最高的回收效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: