ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

【深入理解Java虚拟机】第三章 垃圾收集器与内存分配策略(四)

2022-02-10 15:35:04  阅读:195  来源: 互联网

标签:Java 收集 收集器 虚拟机 3.5 内存 Region 垃圾


3.5 经典垃圾收集器

在这里插入图片描述

3.5.1 Serial收集器

在这里插入图片描述

  • 版本: jdk1.3.1之前
  • 收集区域:新生代
  • 收集方式:单线程收集
  • 收集算法:标记复制
  • 执行过程中需要STW
  • Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择
  • 优点
    • 简单高效
    • 所有收集器里面内存消耗最少的
    • 无线程交互开销,在单核处理器和小内存管理(200M左右)效率较高
  • 缺点
    • 单线程
    • 管理大内存的时候效率极低,导致STW时间过长

3.5.2 ParNew收集器

在这里插入图片描述

  • 收集区域:新生代
  • 收集算法:标记复制
  • 收集方式:多线程并行(实质上是Serial收集器的多线程并行版本,除此之外几乎一模一样)
  • 可以与CMS收集器配合工作

3.5.3 Parallel Scavenge收集器

  • openJDK8默认收集器
  • 收集区域:新生代
  • 收集算法:标记复制
  • 收集方式:多线程并行
  • 关注点:吞吐量,又被成为吞吐量优先收集器
    • 吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)
  • 吞吐量控制参数:
    • -XX:MaxGCPauseMillis 控制最大GC时间
    • -XX:GCTimeRatio 设置吞吐量大小,GC时间比例

3.5.4 Serial Old收集器

在这里插入图片描述

  • 收集区域:老年代
  • 收集算法:标记整理
  • 收集方式:单线程
  • 在JDK 5以及之前的版本中与Parallel Scavenge收集器搭配使用
  • 作为CMS 收集器发生失败时的后备预案

3.5.5 Parallel Old收集器

在这里插入图片描述

  • 收集区域:老年代
  • 收集算法:标记整理
  • 收集方式:多线程并行
  • 在JDK 6 之后提供,Parallel Scavenge的老年代版本。

3.5.6 CMS收集器(Concurrent Mark Sweep)

在这里插入图片描述

  • 收集区域:老年代
  • 收集算法:标记清除 + 标记整理 ,并使用Serial Old兜底
  • 收集方式:多线程并发,(并发:垃圾回收和用户线程同时执行)
  • 优点
    • 并发收集
    • 低停顿
  • 缺点
    • 并发过程中占用用户线程,导致吞吐量降低,CMS默认启动的回收线程数是(处理器核心数量 +3)/4,也就是说,如果处理器核心数在四个或以上,并发回收时垃圾收集线程只占用不超过25%的 处理器运算资源,并且会随着处理器核心数量的增加而下降。
    • 无法处理“浮动垃圾”,而浮动垃圾过多会启用Serial Old进行收集,Serial Old处理大内存的收集,停顿时间是相当久的。
    • 由于使用标记清除算法进行收集清除,导致大量内存碎片,不得不对其进行整理,而整理牵扯到存活对象的移动就需要进行STW,又增加了停顿时间。

浮动垃圾:在CMS的并发标记和并发清理阶 段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生,但这一部分 垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留待下一次垃圾收集 时再清理掉。这一部分垃圾就称为“浮动垃圾”。

3.5.7 Garbage First收集器(G1)

在这里插入图片描述

  • 目标:在延迟可控的情况下获得尽可能高的吞吐 量
  • 里程碑:开创了收集 器面向局部收集的设计思路和基于Region的内存布局形式。
  • 收集范围:面向堆内存任 何部分来组成回收集(Collection Set,一般简称CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式。
  • 由于Region过多,会导致记忆集占用内存过大。根据经验,G1至少要耗费大约相当于Java堆容量10%至20%的额 外内存来维持收集器工作。
  • 可由用户指定停顿时间: -XX:MaxGCPauseMillis 默认200ms
  • 优点
    • 可指定停顿时间
    • 低延迟,高吞吐量
    • Region布局设计,收集速度极快
  • 缺点
    • 多个Region之间跨代引用过多,记忆集占用空间过大

Region布局:G1不再坚持固定大小以及固定数量的 分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。
在这里插入图片描述

标签:Java,收集,收集器,虚拟机,3.5,内存,Region,垃圾
来源: https://blog.csdn.net/rrtfwq/article/details/122820282

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有