JVM学习笔记21-垃圾收集器

JVM-垃圾收集器 通过学习了解到现在商用的JVM中的垃圾收集采用的是分带收集算法,那么针对不同年代采用了不同的收集算法,从而在JVM发展的过程中,就产生了不同的垃圾收集器,一般分为新生代收集器和老年代收集器,两者相互组合进行GC操作(下图中相连的垃圾收集器表示可以相互组合,注意Serial Old和CMS也可以联合进行老年代的垃圾收集)。JDK6u14中开始测试的G1垃圾收集器,正式发布于JDK7u4中,是目前唯一 阅读详情

1.垃圾收集器的种类

如果说收集算法是垃圾回收的方法论,那么垃圾收集器是内存回收的具体实现
主要的垃圾收集器有以下几种:
新生代收集器

  1. Serial收集器
  2. ParNew收集器
  3. Parallel Scavenge收集器

老年代收集器

  1. Serial Old收集器
  2. Parallel Old收集器
  3. CMS收集器
  4. G1收集器

2.垃圾收集的时机

在分代模型的基础上,GC从时机上分为两种

  • Scavenge GC—Minor GC
    • 触发时机:新对象生成时,Eden空间满了
      理论上Eden区大多数对象会在Scavenge GC回收,复制算法的执行效率会很高,Scavenge GC的时间比较短
  • Full GC
    • 对这个JVM进行整理,包括Young, Old和Perm
    • 主要的触发时机:
      • Old满了
      • Perm满了
      • system.gc()
    • 缺点
      • 效率低----故尽量减少Full GC

3.垃圾收集器的并行和并发

  • 并行Parallel—指多个收集器的线程同时工作,用户线程处于等待状态
  • 并发Concurrent—指收集器在工作的同时,可以允许用户线程工作
    • 并发并不代表解决了GC停顿的问题,在关键的步骤还是要停顿
      比如在收集器标记垃圾的时候
      但在清除垃圾的时候,用户线程可以和GC线程并发执行

4.垃圾收集器

4.1 Serial收集器

4.1.1 简介

Serial收集器是单线程收集器

  • 收集时会暂停所有工作线程(Stop The World—STW)
  • 使用复制收集算法
  • 虚拟机运行在Client模式时的默认新生代收集器

4.1.2特点

  • 最早的收集器,单线程进行GC
  • 新生代和老年代都可以使用
  • 在新生代,采用复制算法
  • 在老年代采用标记整理算法
  • 单线程GC,没有多线程切换的额外开销,简单实用
  • Hotspot Client模式默认的收集器运行示意图

4.2 ParNew收集器

4.2.1简介

ParNew收集器就是Serial的多线程版本,除了使用多个收集线程外,其余行为包括

  • 算法
  • STW
  • 对象分配规则
  • 回收策略等

都与Serial收集器一模一样.

对应的这种收集器是虚拟机运行在Server模式的默认新生代收集器,在单CPU环境中,Parnew收集器并不会比Serial收集器有更好的效果

4.2.2 特点

  • Serial收集器在新生代的多线程版本
  • 使用复制算法
  • 只有在多CPU的环境下,效率才会比在Serial收集器高
  • 相关JVM参数
    • -XX:ParallelGCThreads—控制GC线程数的多少,需要结合具体CPU的个数
    • Server模式下新生代的默认收集器

4.3.Parallel Scavenge收集器

Parallel Scavenge收集器也是一个多线程收集器

  • 使用复制算法
  • 其对象分配规则与回收策略都与ParNew收集器有所不同
  • 它是以吞吐量最大化—GC时间占总运行时间最小为目标的收集器实现
  • 它允许较长时间的STW换取总吞吐量最大化

4.4 Serial Old收集器

Serial Old收集器是单线程收集器

  • 使用标记-整理算法那
  • 是老年代的收集器

4.4 Parallel Old收集器

4.4.1 简介

老年代版本吞吐量优先收集器

  • 使用多线程和标记-整理算法
  • JVM 1.6提供
  • 在此之前,新生代使用PS收集器的话,老年代出Serial Old收集器外别无选择—PS无法与CMS收集器配合工作

4.4.2 特点

  • Parallel Scavenge在老年代的实现
  • 在JVM1.6才出现该收集器
  • 采用多线程标记-整理算法
  • 更注重吞吐量
  • Parallel Scavenge+Parallel Old = 高吞吐量,但GC停顿可能不理想
    运行示意图

4.5 CMS收集器

4.5.1 简介

CMS(Concurrent Mark-Swap)是一种以最短停顿时间为目标的收集器,使用CMS并不能达到GC效率最高—总体GC时间最小,但它尽可能降低GC时服务器的停顿时间

  • 使用算法—标记-清除算法

  • 目标—获取最短回收停顿时间为目标
    多数应用于互联网或者B/S系统的服务器端上

4.5.2 执行步骤

整个过程大致分为四步

  • 初始标记—initial mark
  • 并发标记—Concurrent mark
  • 重新标记—remark
  • 并发清除—concurrent sweep
    其中
  • 初始标记,重新标记这两个步骤仍然需要STW
  • 初始标记只是标记一下GC Roots能直接关联的对象,速度很快
  • 并发标记阶段就是GC Roots Tracing的过程
  • 重新标记阶段则是为了修正并发标记期间因用户线程继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段邵长一些,单元比并发标记的时间短

如下图所示运行示意图
在整个过程中耗时最长的并发标记和并发清理过程收集器线程都可以与用户线程一起工作,因此,从总体上看,CMS收集器的内存回收过程是与用户线程一起并发执行的

CMS收集器实际为7步

  • Initial Mark—初始标记 STW
  • Concurrent Mark —并发标记
  • Concurrent Preclean—并发预清除
  • Concurrent Abortable Preclean—并发可失败的预清除
  • Final Remark–最终重新标记 STW
  • Concurrent Sweep—并发清除
  • Concurrent Reset—并发重置

4.5.3 特点

  • 追求最短停顿时间,非常适合Web应用
  • 只针对老年区,一般结合ParNew使用
  • Concurrent, GC线程和用户线程并发工作—尽可能并发
  • Mark-Sweep
  • 只有在多核心CPU环境下才有意义
  • 相关JVM参数
    • -XX:+useConcMarkSweepGC代开

4.5.4 优点

  • 并发收集
  • 低停顿
    Oracle公司的一些官方文档也称之为并发低停顿收集器—Concurrent Low Pause Collector

4.5.5缺点

  • CMS以牺牲CPU资源为代价来减少用户线程的停顿. 当CPU个数少于4的时候,有可能对吞吐量影响非常大
  • CMS在并发清理的过程中,用户线程还在跑. 此时需要预留一部分空间给用户线程
  • CMS用标记-清除算法会带来碎片问题.碎片过多的时候会容易频繁触发Full GC
  • CMS收集器对CPU资源非常敏感
  • CMS收集器无法处理浮动垃圾Floating Garbage
    可能出现"Concurrent Mode Failure"失败而导致另外一次Full GC的产生.

如果在应用中老年代增长不是很快,可以通过参数-XX:CMSInitiatingOccupancyFraction的值来提高触发百分比,以便降低内存回收次数从而获取更好的性能

要是CMS运行期间预留的内存无法满足程序需要时,虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了

所以说参数-XX:CMSInitiatingOccupancyFraction设置的太高很容易导致大量的"Concurrent Mode Failure"失败

  • 收集结束时会有大量空间碎片产品,空间碎片过多时,将会给大对象分配带来很大麻烦,往往出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前进行一次Full GC

CMS收集器提供了一个-XX:+UserCMSCompactAtFullCollection开关参数(默认就是开启的)—用于在CMS收集器顶不住要进行Full GC时开启内存碎片的合并整理过程,内存整理过程是无法并发的,空间碎片问题没有了,但停顿时间不得不变长

Java JVM 中的垃圾收集器及其配置指南 Serial GC: 单线程,适用于小型应用。: 多线程,适用于需要高吞吐量的应用。是 JDK 8 的默认垃圾收集器。: 并发垃圾收集,适用于低停顿时间需求的应用。: 平衡吞吐量和停顿时间,是 JDK 9+ 的默认垃圾收集器。: 超低延迟垃圾收集器,适用于需要极低停顿时间的大内存应用。: 类似于 ZGC,也是超低延迟垃圾收集器。Epsilon GC: 无操作垃圾收集器,主要用于测试和基准分析。在选择 Java 的垃圾收集器时,应根据应用程序的特点和需求来选择最合适的垃圾收集器。 阅读详情

相关推荐

从‘最速控制’到代码:深入拆解韩京清ADRC中TD跟踪器的fhan函数(含Matlab/Simulink实例)

本文深入解析韩京清ADRC中的fhan函数,从理论到代码实现,详细拆解其在Matlab/Simulink中的应用。通过分析最速控制问题和非线性TD的连续形式,揭示fhan函数在信号处理和噪声抑制中的独特优势,并提供工程实践中的参数整定和优化技巧。

weixin_42659194的博客 247

JVM 21 的调优指南:如何进行JVM调优,JVM调优参数

以上示例展现了JVM调优的不同方面,包括内存管理、性能优化和资源利用率的提升。之前写的也有33篇系列教程JVM调优实战打击也可以去围观。每个应用的具体情况都不尽相同,因此在进行JVM调优时,需要根据实际情况进行细致的调整和测试。希望这些示例能够为你掌握JVM调优提供实用的参考。记住,有效的JVM调优策略是基于对应用性能和资源使用的深入了解。持续监控和适时调整,才能确保应用的最佳性能。本文已收录于,我的技术网站ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享。

架构师专栏 3803

THUCNews新闻文本分类-tfidf+sklearn

本文使用的是和鲸社区现有数据集,代码也在和鲸社区公开,fork之后可以直接运行。 本文中所用的数据集清华NLP组提供的THUCNews新闻文本分类数据集的一个子集(原始的数据集大约74万篇文档,训练起来需要花较长的时间)。 本次训练使用了其中的体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐10个分类,每个分类6500条,总共65000条新闻数据。项目在和鲸社区的平台上跑的,数据集直接引用了和鲸的数据集,每个分类6500条,总共65000条新闻数据。 数据集划分如下: cnews

wmq104的博客 4591

JVM垃圾收集——垃圾收集器

垃圾收集器的发展和分类、Serial收集器、ParNew收集器、Parallel Scaveng收集器、CMS收集器、G1收集器、ZGC收集器

码说芯语的博客 2906

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6510

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

天天酷科研的博客 896

【JVM】垃圾收集器详解

垃圾收集器详解

关关的博客 1510

Labview如何0基础自学快速入门?(纯干货帖)

讲解了如何学习Labview,Labview如何0基础入门,自学Labview的方法。什么都不会如何学好Labview的分享,欢迎关注文章~文章提供《Labview宝典》pdf下载,和《Labview虚拟仪器数据采集与通信控制》pdf下载

关注我,更多技术问题欢迎私聊~ 2万+

如何查看JVM使用的是什么垃圾收集器

本文介绍了如何查看JVM使用的垃圾收集器。然后又通过代码验证了一下大对象的内存分配策略:了解了什么情况下大对象会直接进入老年代。

长路漫漫,以勤作车 3300

Python GUI编程:视频播放器(opencv、tkinter、PIL、ffpyplayer、threading)

用了几天做了一个视频播放器,搞了几个版本,开始想的是运用cv2模块把视频转化成一张张图片,然后再用ffpyplayer模块下的相关类来播放视频。但是,结果画面和视频的音频播放不同步(原因是cv2将转换得到的图片展示到tk上canvas,花费的时间多于每张图片应该展示的时间[1/fps])。后面看到ffpyplayer这个模块官网的介绍,发现这个模块可以得到视频播放时的图片,只不过这个图片是一个对象,我对这个不是很了解,到网上找了很久,终于找到了一篇文章,说可以利用PIL模块下的相关类,把上述这个对象转化成。

坚持不懈的大白的博客 3407

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

JVM之垃圾收集器

JVM垃圾收集器是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法)的具体实现,不同JVM所提供的垃圾收集器可能会有很大差别。Java垃圾回收器为应用程序提供内存的自动分配、自动回收功能。

积跬步,至千里。 821

C#串口通信从入门到精通(1)——硬件接线

RS-232接口一般都是9针的,有公母头(针头和孔头),为了便有理解以下都称为针头和孔头,针头就是露出来的针,孔头就是9个孔,总共使用3条线进行通信,一条用于发送,一条用于接收,另外一根是GND地线,由于线路的功能是永久性的,设置连接时,必须确保一个节点的发送线与另一个节点的接收线相连,反之亦然,RxD(PC的接收线)连接到TxD(传感器电子设备的发送线),TxD(PC的发送线)连接到RxD(传感器电子设备的发送线)。两条线路的电平都是相对于GND的。因此,GND也必须连接,但不能将GND与屏蔽连接。

qq_34059233的博客 1万+

一文搞懂 JVM 垃圾收集器

G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多核心处理器及大容量内存的机器(4G 以上的服务器才建议使用 G1 垃圾回收器),结合多种垃圾收集算法,从整体上看是基于标记-整理算法,从局部来看是基于标记-复制算法,都不会产生空间碎片,可预测的停顿,可以指定垃圾收集的时间,以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能。总结:本篇简单分享了垃圾收集器的工作流程及原理,对我们理解 JVM 以及 JVM 内存调优有一定的帮助,希望可以帮助到正在提升的你。

weixin_42118323的博客 1104

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JVM的垃圾收集器

继上期简单介绍了一下JVM的基本知识与垃圾回收机制,本期来为大家介绍JVM中垃圾回收器迭代与特性。

2301_77061447的博客 1037

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JVM_垃圾收集器

注意:并行垃圾回收在单核CPU下可能会更慢。

m0_58617940的博客 1171

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

常见的jvm垃圾收集器有哪些

场景推荐收集器理由个人电脑、小型测试开销最小,足够使用JDK 8 默认、计算密集型吞吐量优先,最大化计算效率JDK 8 及之前,Web应用响应时间优先,减少用户请求延迟JDK 9+ 默认,通用服务端G1在吞吐量和延迟间取得最佳平衡,大堆友好超大堆、极致低延迟ZGC(或Shenandoah停顿时间极短且可预测,适用于核心金融、实时系统演进路线Serial->Parallel(吞吐量) ->CMS(低延迟) ->G1(全堆、可预测停顿) ->(极致低延迟)

埃泽漫笔 790

JVM常用垃圾收集器

JDK8默认收集器( JDK1.8 默认使用的是 Parallel Scavenge + Parallel Old,如果指定了-XX:+UseParallelGC 参数,则默认指定了-XX:+UseParallelOldGC,可以使用-XX:-UseParallelOldGC 来禁用该功能)ZGC 可以将暂停时间控制在几毫秒以内,且暂停时间不受堆内存大小的影响,出现 Stop The World 的情况会更少,但代价是牺牲了一些吞吐量。不过,默认的垃圾回收器依然是 G1。各个垃圾收集器可以配合使用。

YSecret_Y的博客 1171

JVM调优之JVM垃圾收集器

JVM垃圾收集器,Serial、Serial Old、Parallel Scavenge、Parallel Old、ParNew、CMS、G1、ZGC

weixin_43575663的博客 1455

JDK 21 G1 垃圾收集器详解

G1 (Garbage-First) 垃圾收集器是 Oracle JDK 中的一种低延迟、高吞吐量的垃圾收集器,自 JDK 7u4 版本引入以来,一直是 Java 虚拟机 (JVM) 中备受推崇的垃圾收集器。从 JDK 9 开始,G1 成为默认的垃圾收集器。JDK 21 对 G1 进行了重大改进,引入了 Generational G1 (代际 G1) 特性,进一步优化了内存管理和垃圾收集效率。本文将详细介绍 JDK 21 中 G1 垃圾收集器的原理、特性、新增功能、配置参数以及性能优化建议。

henu_ws的专栏 759

JVM学习笔记_垃圾收集器重要参数

目录-XX:+UseParallelGC-XX:+UseSerialGC-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:PretenureSizeThreshold-XX:MaxTenuringThreshold-XX:TargetSurvivorRatio 垃圾收集器有串行收集器,比如 Serial收集器+Serial Old收集器,Parallel Scavenge+Parallel Old收集器等等。该如何让这些不同的垃圾收集器组合触发使用呢? -XX:+UseP

dcj199411的专栏 3052

三种方式查看 JVM 垃圾收集器

111

快乐的小三菊的博客 4422

【JVM】JVM垃圾收集器

垃圾收集器是负责执行垃圾回收的组件,它们用于管理Java程序运行时的内存分配和释放。垃圾收集器的主要任务是自动回收不再使用的内存对象,并将内存空间重新回收以供程序继续使用。

weixin_45618869的博客 1045

JVM学习笔记25-G1垃圾收集器三色标记算法和SATB

1三色标记算法 对于并发标记,我们不得不了解并发标记的三色标算法 它是描述追踪式回收器的一种有效方法,利用它可以推演回收器的正确性 我们将对象分成三种类型: 黑色—根对象, 或者该对象与它的子对象都被扫描过(对象被标记了,且它的所有field都被标记完了) 灰色—对象本身被扫描,但还没扫描完该对象中的子对象(它的field还没有被标记或标记完) 白色—未被扫描对象,扫描完成所有对象之后,最终为白...

lu322313的博客 2378
上一篇: Java源码分析3-HashMap
下一篇: JVM学习笔记2-主动使用及代码示例
L.T.F.
博客等级 码龄14年 2粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值