博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM垃圾收集器介绍
阅读量:5904 次
发布时间:2019-06-19

本文共 1636 字,大约阅读时间需要 5 分钟。

  垃圾回收算法是GC的方法论,垃圾收集器就是内存回收的具体实现。

  一、Serial 收集器

    单线程收集器,在进行GC时,必须暂停所有的工作线程(Stop The World),直到GC收集结束。

    缺点:“Stop The World”给用户带来了不好的体验

    优点:简单而高效,Serial没有其他线程交互的开销,专心做GC可以获得最高的单线程收集效率。

    适用于Client模式下的虚拟机是个很好的选择。

  二、ParNew 收集器

     ParNew收集器就是Serial收集器的多线程版本,适用于Service模式下的新生代收集器。

     ParNew在单核CPU环境中绝对不会有比Serial收集器更好的效果。但是多核CPU,GC效果还是不错的。  

  三、Parallel Scavenge 收集器

    Parallel Scavenge 收集器也是一个新生代收集器,使用复制算法,同时也是一个并行的多线程收集器。

    Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量。

    注:吞吐量 =用户运行代码时间 / (运行代码时间 + 垃圾收集时间)

    吞吐量高则可以最高效率的利用CPU时间,尽快的完成程序的运算任务,主要适用于后台运算二不需要太多的交互任务。

  四、Serial Old 收集器

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

  五、Parallel Old 收集器

    Parallel Old 收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

  六、CMS 收集器

    CMS(Concurrent Mark Sweep)收集器是一种以获取最短停顿时间为目标的收集器。目前很大一部分Java应用程序都集中是在互联网或B/S系统的服务器上,这类应用尤其重视服务器的响应速度,希望系统停顿时间最短,给用户最好的体验。整个过程分为四步:

  • 初始标记(CMS initial mark):标记一下GC Root能直接关联到的对象,速度很快;
  • 并发标记(CMS concurrent mark):进行GC Root Tracing的过程
  • 重新标记(CMS remark):修正并发标记期间,因用户程序继续运行导致标记产生变动的那一部分对象的标记记录;
  • 并发清除(CMS concurrent sweep)  

  其中初始标记、重新标记还是需要“Stop The World”.CMS收集器的内存回收过程与用户线程并发执行。

  优点是并发收集、低停顿

  缺点:1)CMS收集器对CPU资源非常敏感;在并发阶段虽然不会导致用户线程停顿,但是会因为占用了一份线程而导致应用程序变慢,总吞吐量降低。

     2)CMS并发清除阶段用户线程还在运行,伴随线程运行产生的新的垃圾出现在标记过程以后,CMS无法在本次收集中处理掉它们,只能留到下次GC。这一部分垃圾就是“浮动垃圾”。

     3)CMS是一款“标记-清除”算法实现的收集器,收集过程会产生大量的空间碎片。空间碎片过多,将会给较大对象无法分配内存,从而触发一次 Full GC.

  七、G1 收集器

    G1(Garbage First)收集器相比于CMS改进有:

    (1)G1基于“标记-整理”算法实现收集器,即它不会产生大量的空间碎片,这对于长时间的应用系统非常重要。

    (2)可以非常准确的控制停顿,既能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不超过N毫秒。G1将Java堆(包括新生代、老年代)划分为多个大小固定独立区域,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域。

转载地址:http://nqkpx.baihongyu.com/

你可能感兴趣的文章
移动端拖拽(模块化开发,触摸事件,webpack)
查看>>
spring配置和注解事务同时存在导致的事务嵌套
查看>>
AE要素选择(点选和拉框选择)
查看>>
AJAX-初学AJAX本地环境配置
查看>>
Java内存模型深度解析:顺序一致性--转
查看>>
VSCode调试配置
查看>>
前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite
查看>>
Selenium Web 自动化 - 项目持续集成(进阶)
查看>>
java&javaweb学习笔记
查看>>
UML统一建模语UML2和EnterpriseArchitect
查看>>
C#编程(二十二)----------继承的类型
查看>>
【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)...
查看>>
在 Visual Studio 2017 中找回消失的“在浏览器中查看”命令
查看>>
ajaxupload 异步上传工具
查看>>
微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
查看>>
机器学习 - pycharm, tensorflow集成篇
查看>>
为iframe添加onclick事件
查看>>
vue - 官方 - 上手
查看>>
Springboot 之 引入Thymeleaf
查看>>
Java基础-位运算符Bitwise Operators
查看>>