深入浅出JVM之垃圾回收器

  1. Serial垃圾回收器

    1. 垃圾回收算法是内存收到的方法论,垃圾回收器是内存回收的具体实现。复制算法
    2. Serial是一个单线程的垃圾回收器
  2. Serial的特点

    1. “Stop The World”,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。在用户不可见的情况下,把用户正常的工作线程全部停掉。
    2. 使用场景:多用于桌面应用,client端的垃圾回收器
    3. 桌面应用内存小,进行垃圾回收的时间比较短,只要不频繁停顿就可以接受
  3. ParNew垃圾回收器

    其实就是Serial的多线程版本,除了使用多条线程进行垃圾收集外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略都与Serial收集器完全一样,在实现上,两者公用了相当多的代码。

  4. ParNew垃圾回收器的特点

    1. ParNew垃圾回收器除了多线程收集之外,与Serial相比并没有太多的创新,但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关的重要原因是,除了Serial之外,目前只有ParNew能与CMS收集器配合工作。
    2. 使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数,对应CPU核数,线程数太大的话会存在上下文切换的问题
    3. 用来回收新生代
  5. 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

  6. 并发(Concurrent):至用户线程与垃圾手机线程同时执行(但一定不是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。

  7. Parallel Scavenge收集器

    1. Parallel Scavenge是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器
    2. 由于有吞吐量密切相关,Parallel Scavenge收集器也经常被称为"吞吐量优先"收集器
  8. 吞吐量:CPU用户代码的时间与CPU运行总时间的比例,99%的时间执行用户线程,1%的时间回收垃圾,这时候吞吐量就是99%。

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

  10. Parallel Scavenge收集器特点

    1. Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMC等收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器收集器的目标则是达到某个可控制的吞吐(Throughput)
    2. 虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种方式被称为GC自适应调节策略。
    3. -XX:MaxGCPauseMillis参数GC停顿时间,这个参数太小的话会发生频繁GC
    4. –XX:GCTimeRatio参数,吞吐量的值,默认99%
  11. Serial old收集器:它是一个单线程的收集器,用于老年代的收集,使用"标记–整理"算法

  12. Parallel old收集器:是Parallel Scavenge的老年代版本,使用多线程+标记整理算法

  13. CMS收集器:

    1. CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
    2. 目前很大一部分的Java应用集中在互联网站或者B/S系统的服务器上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。
    3. CMS收集器是基于"标记–清除"算法实现的
  14. CMS收集流程

    1. 初始标记(时间很短):标记一下GC Roots能直接关联到的对象,速度很快
    2. 并发标记(与用户线程同时进行):进行GC RootsTracing的过程
    3. 重新标记(时间很短):为了修正并发标记期间因用户程序导致标记产生变动的标记记录
    4. 并发清除(与用户线程同时进行)(效率比较低)
  15. CMS收集器的特点:

    1. 对CPU资源非常敏感
    2. 无法处理浮动垃圾(在并发清除期间用户线程新产生的垃圾)
    3. 标记–清除暂时空间碎片
  16. G1收集器

    1. G1是一款面向服务端应用的垃圾收集器,性能比较高。
  17. G1收集器的特点:G1中每个Region都有一个与之对应的Remembered Set,当进行内存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏。

  18. G1收集器收集的过程

    1. 初始标记(Initial Marking):标记一下GC Roots能直接关联到的对象
    2. 并发标记(Concurrent Marking):从GC Root开始对堆中的对象进行可达性分析,找出存活的对象,这个阶段耗时较长,但是可以与用户线程并行执行。
    3. 最终标记(Final Marking):为了修正在并发标记期间因用户程序继续运作二导致标记产生变动的那一部分标记记录。虚拟机将这段时间对象变化记录在线程Remembered Set Logs里面,最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set 中
    4. 筛选回收(Live Data Counting Evacuation)(效率比较g高)
  19. G1的优势:

    1. 基于标记–整理算法实现为主和Region之间采用复制算法实现垃圾回收
    2. 可预测的挺顿,这是G1相对于CMS另一大优势,降低挺顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型。
    3. 在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1不再是这样。使用G1收集器,Java堆的内存布局就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留由新生代和老年代的概念,但新生代和老年代不再是物理的隔离了,它们都是一部分Region(不需要连续)的集合。
    4. G1收集器之所以能建立可预测的挺顿时间模型,是因为它可以有计划的避免在整个Java堆中进行全区域的垃圾回收。G1跟踪各个Regions里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高的的内存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值