jvm七种垃圾收集器

JVM_七种垃圾收集器介绍

 
本文中的垃圾收集器研究背景为:HotSpot+JDK7
一、垃圾收集器概述
如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。
JVM会从年轻代和年老代各选出一个算法进行组合, 连线表示哪些算法可以组合使用
 
二、各个垃圾收集器说明
1、Serial(年轻代)
  1. 年轻代收集器,可以和Serial Old、CMS组合使用
  2. 采用复制算法
  3. 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止
  4. client模式年轻代默认算法
  5. GC日志关键字:DefNew(Default New Generation)
  6. 图示(Serial+Serial Old)
2、ParNew (年轻代)
  1. 新生代收集器,可以和Serial Old、CMS组合使用
  2. 采用复制算法
  3. 使用多线程进行垃圾回收,回收时会导致Stop The World,其它策略和Serial一样
  4. server模式年轻代默认算法
  5. 使用-XX:ParallelGCthreads参数来限制垃圾回收的线程数
  6. GC日志关键字:ParNew(Parallel New Generation)
  7. 图示(ParNew + Serail Old)
3、Paralle Scavenge (年轻代)
  1. 新生代收集器,可以和Serial Old、Parallel组合使用,不能和CMS组合使用
  2. 采用复制算法
  3. 使用多线程进行垃圾回收,回收时会导致Stop The World
  4. 关注系统吞吐量
    1. -XX:MaxGCPauseMillis:设置大于0的毫秒数,收集器尽可能在该时间内完成垃圾回收
    2. -XX:GCTimeRatio:大于0小于100的整数,即垃圾回收时间占总时间的比率,设置越小则希望垃圾回收所占时间越小,CPU能花更多的时间进行系统操作,提高吞吐量
    3. -XX:UseAdaptiveSizePolicy:参数开关,启动后系统动态自适应调节各参数,如-Xmn、-XX:SurvivorRatio等参数,这是和ParNew收集器重要的区别
  5. GC日志关键字:PSYoungGen
 
4、Serial Old (年老代)
  1. 年老代收集器,可以和所有的年轻代收集器组合使用(Serial收集器的年老代版本)
  2. 采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理
  3. 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止
  4. GC日志关键字:Tenured
  5. 图示(Serial+Serial Old)
     
5、Parallel  Old(年老代)
  1. 年老代收集器,只能和Parallel Scavenge组合使用(Parallel Scavenge收集器的年老代版本)
  2. 采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理
  3. 关注吞吐量的系统可以将Parallel Scavenge+Parallel Old组合使用
  4. GC日志关键字:ParOldGen
  5. 图示(Parallel Scavenge+Parallel Old)
     
6、CMS(Concurrent Mark Sweep 年老代)
  1. 年老代收集器,可以和Serial、ParNew组合使用
  2. 采用 ”标记-清除“算法,可以通过设置参数在垃圾回收时进行内存碎片的整理
    1、UserCMSCompactAtFullCollection:默认开启,FullGC时进行内存碎片整理,整理时用户进程需停止,即发生Stop The World
    2、CMSFullGCsBeforeCompaction:设置执行多少次不压缩的Full GC后,执行一个带压缩的(默认为0,表示每次进入Full GC时都进行碎片整理)
  3. CMS是并发算法,表示垃圾回收和用户进行同时进行,但是不是所有阶段都同时进行,在初始标记、重新标记阶段还是需要Stop the World。CMS垃圾回收分这四个阶段
    1、初始标记(CMS Initial mark)    Stop the World   仅仅标记一下GC Roots能直接关联到的对象,速度快
    2、并发标记(CMS concurrent mark) 进行GC Roots Tracing,时间长,不发生用户进程停顿
    3、重新标记(CMS remark)          Stop the World   修正并发标记期间因用户程序继续运行导致标记变动的那一部分对象的标记记录,停顿时间较长,但远比并发标记时间短
    4、并发清除(CMS concurrent sweep) 清除的同时用户进程会导致新的垃圾,时间长,不发生用户进程停顿
  4. 适合于对响应时间要求高的系统
  5. GC日志关键字:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等等
  6. 缺点
    1、对CPU资源非常敏感
    2、CMS收集器无法处理浮动垃圾,即清除时用户进程同时产生的垃圾,只能等到下次GC时回收
    3、因为是使用“标记-清除”算法,所以会产生大量碎片
  7. 图示
 
7、G1
  1. G1收集器由于没有使用过,所以从网上找了一些教程供大家了解
    1. 并行与并发
    2. 分代收集
    3. 空间整合
    4. 可预测的停顿
  2. http://blog.csdn.net/renfufei/article/details/41897113
  3. http://blog.csdn.net/woshiqjs/article/details/7290513 
 
 
三、各垃圾收集参数设置
 
  

转载于:https://www.cnblogs.com/lushilin/p/6140507.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM (Java Virtual Machine) G1 (Garbage-First) 垃圾收集器是一种用于 Java 应用程序的垃圾收集算法。它是自JDK 7u4版本后引入的一种全新的垃圾收集器。 G1垃圾收集器的设计目标是为了解决传统的分代垃圾收集器可能遇到的一些问题,如停顿时间长、内存碎片化等。它采用了一种基于区域的垃圾收集方式,可以将内存划分为多个大小相等的区域,每个区域可以是Eden、Survivor或Old区。 G1垃圾收集器的工作原理如下: 1. 初始标记(Initial Mark):标记所有从根对象直接可达的对象。 2. 并发标记(Concurrent Mark):在并发执行程序的同时,标记那些在初始标记阶段无法访问到的对象。 3. 最终标记(Final Mark):为并发标记阶段中发生改变的对象进行最终标记。 4. 筛选回收(Live Data Counting and Evacuation):根据各个区域的回收价值来优先回收价值低的区域。 G1垃圾收集器具有以下特点: - 并发执行:在执行垃圾收集过程时,尽可能减少应用程序的停顿时间。 - 分区回收:将整个堆划分为多个区域,可以根据需要优先回收垃圾较多的区域,从而避免全堆回收带来的长时间停顿。 - 内存整理:G1垃圾收集器会对内存进行整理,减少内存碎片化,提高内存利用率。 需要注意的是,G1垃圾收集器并不适用于所有情况。在特定的场景下,如大堆情况下的长时间运行、对延迟要求非常高的应用等,可能需要考虑其他垃圾收集器的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值