文章目录

  • 前言
  • 一、HotSpot 虚拟机的垃圾收集器
  • 二、年轻代垃圾收集器
    • 1、 串行收集器 ( Serial )
    • 2、 ParNew 收集器
    • 3、 Parallel Scavenge 收集器
  • 二、老年代垃圾收集器

前言

参考 【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 ) 博客 ;

一、HotSpot 虚拟机的垃圾收集器


HotSpot 虚拟机的垃圾收集器 : 上层的是 年轻代 内存区域的垃圾收集器 , 下层是 老年代 内存区域的垃圾收集器 , Tenured generation 就是老年代 ;

年轻代的垃圾回收器 :

  • Serial
  • ParNew
  • Parallel Scavenge

老年代的垃圾回收器 :

  • CMS
  • Serial Old ( MSC )
  • Parallel Old

Serial 垃圾回收器 是 单线程垃圾收集器 , 垃圾回收时 , 需要暂停当前的 Java 线程 , 进行垃圾回收 , 这样会造成程序卡顿 ;

ParNew 垃圾回收器 是 多线程的垃圾收集器 , 是 Serial 垃圾回收器 的 多线程版本 ;

二、年轻代垃圾收集器


1、 串行收集器 ( Serial )

串行收集器 ( Serial ) : 新生代内存回收使用该回收机制 ;

① 运行内存区域 : Serial 串行垃圾回收器 在 年轻代 内存区域中收集要回收的内存 ;

② 垃圾回收算法 : 复制算法 ;

③ 运行机制 : 垃圾回收线程运行时 , 暂停用户线程 ;

④ 最基本 GC : Serial 串行垃圾回收器 , 这是最基本的垃圾回收器 , 老版本的 Java 虚拟机使用的就是这种垃圾回收器 ;

⑤ 特点 : 其工作时 , 是单线程 , 串行的 ;

⑥ 单线程执行 : 该垃圾回收器 , 需要暂停所有线程 , 使用单个线程处理回收多个线程的内存回收工作 ;

⑦ 暂停线程 : 执行垃圾回收时 , 必须暂停工作线程 , 直到垃圾收集结束后 , 才能绘制执行 ;

⑧ 安全点 : 停止工作线程的位置是 安全点 , 需要保存该位置的程序执行信息 ;

⑨ 优势 : 不需要处理多线程交互问题 ;

年轻代 , 复制算法 , 单线程 GC , 暂停用户线程

2、 ParNew 收集器

ParNew 收集器 :

① 运行区域 : ParNew 垃圾回收器 在 年轻代 内存区域中收集要回收的内存 ;

② 垃圾回收算法 : 复制算法 ;

③ 运行机制 : 垃圾回收线程运行时 , 暂停用户线程 ;

④ 多线程执行 : 该垃圾回收器 多线程运行 , 消耗时间要比 Serial 串行垃圾回收器要短 ;

⑤ 与 Serial 垃圾回收器对比 : 该 GC 是并行的 , 是 Serial 垃圾回收器的多线程版本 ;

年轻代 , 复制算法 , 多线程 GC , 暂停用户线程

3、 Parallel Scavenge 收集器

Parallel Scavenge 收集器 :

① 运行区域 : Parallel 垃圾回收器在 年轻代 内存区域中收集要回收的内存 ;

② 垃圾回收算法 : 复制算法 ;

③ 关注吞吐量 : Parallel 垃圾回收器 与 ParNew 垃圾回收器 区别是 , Parallel 垃圾回收器更关注吞吐量 ;

④ 吞吐量概念 : 吞吐量是 CPU 运行正常代码时间与总的消耗时间之间的比值 , CPU 运行的总时间是 程序运行时间 与 GC 垃圾收集的时间之和 ;

⑤ 吞吐量示例 : CPU 总共运行 100 秒 , 程序运行 95 秒 , 垃圾回收器运行 5 秒 , 那么吞吐量就是 95 100 = 0.95 \dfrac{95}{100} = 0.95 10095​=0.95 ;

年轻代 , 复制算法 , 多线程 GC , 暂停用户线程 ( 关注吞吐量 )

二、老年代垃圾收集器


1. CMS 垃圾回收器 : 全称 Concurrent Mark Sweep , 并发标记清除收集器 ;

① 运行区域 : CMS 垃圾回收器在 老年代 内存区域中收集要回收的内存 ;

② 垃圾回收算法 : 标记-清除算法 , 会产生很多内存碎片 ;

2. 短暂停顿 : 在 GC 线程运行时 , 用户线程仅做最短的停顿 , 在停顿过程中主要用于标记内存 ;

由于其停顿时间是各个 GC 算法中最短 , 该并发标记清除收集器又叫 并发低延迟收集器 ;

3. CMS 收集器工作流程 ( 重点 ) : 要标记 3 3 3 次后 , 才可以执行清除操作 , 共 4 4 4 步骤 ;

① 初始标记 : 标记与 GC Roots 有引用链的对象 ; 该操作速度快 , 该步骤需要暂停用户线程 ;

② 并发标记 : GC Roots 追踪 , 从初始标记结果集合中标记出存活对象 , 不能保证所有的存活对象都被标记 ; 该步骤与应用程序并发执行 ;

③ 重新标记 : 上一步并发标记 GC 线程与用户程序并发期间的标记有部分变化 , 修正这部分标记信息 , 之后暂停用户线程 , 开始标记 ; 该暂停操作要比初始标记步骤暂停时间长 ;

④ 并发清除 : 回收所有 GC Roots 不可达对象 ;

上述四个步骤中 , 并发标记 , 并发清除 , 用时最长 , 但这两个与用户线程并发执行 , 因此可以看做该 CMS 垃圾收集器与用户线程是并发执行的 ;

4. CMS 收集器缺点 :

① CPU 性能消耗 : 多开线程 , 意味着 CPU 性能消耗多 ;

② 内存碎片 : 使用 标记-清除算法 , 会造成很多内存碎片 , 严重的话导致 OOM ;

③ 浮动垃圾 : 由于 GC 线程 与用户线程并发 造成的 , 在 GC 运行过程中产生的用户线程垃圾 , 需要等待下一次 GC 清理 , 这些垃圾就是浮动垃圾 ;

【Java 虚拟机原理】垃圾收集器 ( Serial | ParNew | Parallel Scavenge | CMS | Serial Old - MSC | Parallel Old )相关推荐

  1. java虚拟机手动内存分配_《深入理解java虚拟机》-垃圾收集器与内存分配策略

    如何判断对象已死? 引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器减1:其中计数器为0的对象是不可能再被使用的已死对象. 引用计数算法的实现很简单 ...

  2. Java虚拟机04——垃圾收集器

    主要介绍HotSpot虚拟机的垃圾收集器,这个虚拟机包含的所有收集器如图所示: 可以看到,收集器之间是可以搭配使用的.下面介绍这些收集器的特性.基本原理和使用场景.在介绍之前先明确一个观点:直到现在为 ...

  3. java虚拟机系列:垃圾收集器

    垃圾收集器是垃圾回收算法(标记-清除算法.复制算法.标记-整理算法)的具体实现,不同商家.不同版本的JVM所提供的垃圾收集器可能会有很在差别. 图中展示了7种不同分代的收集器: Serial.ParN ...

  4. 《深入理解Java虚拟机》——垃圾收集器的具体实现

    2019独角兽企业重金招聘Python工程师标准>>> 如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定 ...

  5. 深入理解Java虚拟机 -- 经典垃圾收集器

    文章目录 1. 综述 2. Serial收集器 3. ParNew收集器 4. Parallel Scavenge收集器 5. Serial Old收集器 6. Parallel Old收集器 7. ...

  6. java gc cms_Java垃圾收集器:G1GC何时将CMS强制退出?

    java gc cms 在针对JDK 9(2017/4/4)提出的JEP中 , Mark Reinhold写道JEP 291 ("弃用并发标记扫描(CMS)垃圾收集器")是&quo ...

  7. 关于JVM虚拟机的垃圾收集器7种——摘自《深入理解java虚拟机》(每天学一点Day20191114)

    虚拟机的垃圾收集器(98页) 1.Serial(串行)收集器:最基本.发展历史最悠久的收集器.虚拟机运行在Client模式下的默认新生代收集器.新生代采用复制算法暂停所有用户线程.老年代采用标记-整理 ...

  8. java垃圾收集器zgc_java虚拟机ZGC垃圾收集器的实现方法

    java虚拟机垃圾回收算法和工具是我们在学习java虚拟机的时候需要重点掌握的编程知识,而今天我们就通过案例分析来了解一下,java虚拟机ZGC垃圾收集器的实现方法. 1.染色指针 HotSpot的垃 ...

  9. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

    参考网址:http://blog.csdn.net/luanlouis/article/details/50529868 0.前言 读完本文,你将了解到: 一.为什么说Jabalpur语言是跨平台的 ...

最新文章

  1. 使用pipeline的函数
  2. OpenCASCADE绘制测试线束:几何命令之概述
  3. 命令行查看网卡使用的驱动+跳板机命令行设置静态地址
  4. 补丁 检测系统_大云制造 | BCLinux For ARM64 V7.6操作系统正式发布
  5. scala语言示例_var关键字与Scala中的示例
  6. InstallShield安装过程介绍
  7. STM32库中自定义的数据类型
  8. 分享3个整站打包程序
  9. svn server 配置 与TortoiseSVN、Ankhsvn+VS使用 及 问题
  10. 《Oracle 11g SQL 和PL SQL从入门到精通》 学习笔记
  11. 最厉害的象棋软件_太牛了!象棋史上最厉害人机高手竟弃车跟软件对杀,就问你敢不敢...
  12. 关于U盘病毒autorun.inf更改文件夹属性为系统文件夹并隐藏文件夹
  13. Mysql 生成随机数字
  14. 移动硬盘损坏,数据能恢复吗
  15. 淘宝线上线下“出淘”欲打造零售业航母
  16. Mac air装 win10 ,总是提示拷贝windows安装文件失败!?
  17. 2022年前端面试题总结
  18. JAVA基础——集合【源码剖析】
  19. 密度聚类:OPTICS算法简单易懂版
  20. 中国大学MOOC课程《程序设计入门——C语言》翁恺老师 第六周测试题 高精度小数(习题记录)

热门文章

  1. 荷兰 转专业 计算机,关于荷兰留学转专业的那些事
  2. 苹果天气不显示服务器停止,iphone手机通知栏天气不显示怎么办?解决iphone手机通知栏天气无法正常显示的方法...
  3. 微服务调调接口超时Read timed out executing
  4. Java 实现出租车计费问题
  5. 利用svg错落显示文本
  6. SpringBoot 属性注入的四种方式
  7. pycharm设置国内清华源
  8. Vi编辑器使用和Shell程序设计
  9. 小程序原生 canvas 绘制身份证区域
  10. 【C#】wpf添加gif动图支持