垃圾收集器

如何查看JDK使用的垃圾收集器 阅读详情

hotspot虚拟机中提供了多款垃圾收集器,每款收集器有它的特点以及适用范围,开发人员可根据对象生命周期特点,内存使用情况等使用参数选择合适的垃圾收集器。

下面给出hotspot中所有虚拟机的结构图。这些虚拟机有些用于新生代垃圾手机,有些用于老年代垃圾手机,新生代垃圾收集器采用的都是复制算法,老年代垃圾手机采用的有标记-清除算法、标记-整理算法。
这里写图片描述

下面对这几种收集器做一个简单的总结:

1.Serial串行收集器

serial串行收集器是最基本、历史最长的收集器。

特点:新生代收集器,单线程收集器,在执行GC过程时,会暂定所有用户线程,GC完成之后其他用户线程才能继续执行。

缺点:执行GC过程暂定所有用户线程,如果内存大,垃圾多,GC时间过长,导致系统长时间没有反应,用户体验不好。

适用情况:单cpu情况下,没有线程交互开销,适用于Client模式,如桌面应用场景,分配给虚拟机的内存不会很大,几十到几百兆之间,内存不大时,回收速度会快。
这里写图片描述

2.ParNew收集器

Serial收集器是新生代单线程收集器,在多核,多cpu情况下,其cpu资源利用率不高,并且在待回收内存空间很大时,serial会让用户线程等待时间足够长。根据serial的不足之处,进行改进,将GC线程由单线程变为多线程。其他并无改变。在GC时,同样需要“STOP THE WORLD”。

优势:相比serial收集器,由单线程改进为多线程;相比Parallel收集器,能与老年代并发收集器CMS配合使用。

缺点:在单cpu情况下,收集效果不如Serial收集器,因为存在线程交互的开销。

**适用范围:**Server模式下的虚拟机中,因为server模式下必然是多核
这里写图片描述

3.Parallel Scanvage

与ParNew收集器一样,Parallel Scanvage收集器属于多线程的新生代收集器。与PaNew不同的地方是ParNew关注的是尽可能缩短GC时间,而Parallel Scanvage关注的是提高吞吐量(吞吐量=用户线程执行时间/(用户线程执行时间+GC线程执行时间))。所以,ParNew适用于与用户进行交互的环境下,停顿时间短,用户体验更好。提供两个参数用于控制停顿时间以及吞吐量

适用范围:高效率利用cpu时间,不需要与用户进行交互,在后台快速执行计算任务。

优势:提升吞吐量,自适应调节策略(根据系统运行情况,自适应调整相应jvm参数)
这里写图片描述

4.Serial Old

Serial收集器的老年代版本,同样是单线程环境下,采用的是标记-整理算法。

5.Parallel Old收集器

Parallel Scanvage的老年代版本,采用标记-整理算法。与Parallel Scanvage组合适用于注重吞吐量,cpu资源敏感的环境中。

6.CMS收集器

采用标记-清除算法,目标旨在缩短停顿时间。最大的特点是前面所提到的5款垃圾收集器,在执行GC线程时,会停顿用户线程,而CMS收集器将GC过程划分成4个步骤,在其中2个步骤中是可以并发执行,也即是执行用户线程的同时,其他cpu可以执行GC中的并发步骤。由于并发的加入,所以CMS收集器,系统停顿时间短。

适用范围:对响应时间要求比较高的B/S系统的服务端。

过程:

  1. 初始标记:标记出与GC Roots直接关联的引用,速度很快
  2. 并发标记:能与用户线程并发执行,标记出GC Roots引用链上所有对象
  3. 重新标记:由于并发标记时,用户线程也在执行,这一部分用于修改并发标记时部分引用变动的情况。
  4. 并发清除

在以上4个步骤中,初始标记和重新标记必须要暂停用户线程,但是这俩个步骤执行速度很快,并发标记和并发清除,耗时较长,与用户线程可以并发执行。

缺点:

  • 无法处理浮动垃圾,可能会出现“Concurrent Mode Failure”而导致FULL GC,这是由于在并发标记过程中会产生新垃圾,而新的垃圾只能等到下次垃圾收集时再进行清除。由于CMS在执行GC的过程中还可以执行用户线程,所以需要预留一定的空间,不能等到空间快满时才进行GC,如果预留的空间不够新对象所需的空间,将会发生“Concurrent Mode Failure”,此时会将Serial Old作为老年代收集器,进行垃圾回收。
  • 空间碎片,由于CMS采用标记-清除算法,所以容易产生空间碎片,如果大对象找不到足够的连续空间,将会频繁地启用FULL GC,同样影响系统性能。在CMS中,针对空间碎片问题,CMS提供了一个可以进行内存整理的开关参数。
  • 对cpu资源敏感,在并发阶段,由于占用了用户线程,所以吞吐量会下降。

这里写图片描述

7.G1收集器

G1收集器是面向服务端应用的一款收集器。

特点:

  • 与CMS收集器一样,是一款并发并行的收集器,支持GC过程用户线程可以继续执行
  • 分代收集,不同于前面所提到的几款收集器,只能用于新生代或者老年代,而CMS可以管理整个java堆,G1收集器将java堆区域划分成多个大小相等的区域。
  • 空间整合,CMS整体采用标记-整理算法,区域之间采用复制算法。
  • 可预测的停顿,能让使用者明确指定在一个时间长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不超过m毫秒,后面对原因进行说明。

为什么G1收集器可以达到可预测的停顿?

G1收集器将java堆划分成大小相等的独立区域,通过跟踪各个区域里面垃圾堆积的价值大小,(回收所获得空间大小以及回收所需时间的经验值),在后台维护一个优先列表,根据允许收集时间,选择一个价值最大的区域进行回收。

过程

  1. 初始标记
  2. 并发标记
  3. 最终标记
  4. 筛选回收:对各个区域中的回收价值进行排序,选择允许时间内,价值最大的进行回收

G1收集器的过程与CMS过程类似。
这里写图片描述

总结:上面提到了7款收集器,每款收集器都有适用场景,特点,需要根据应用环境进行设置最适合的收集器。其中新生代收集器有Serial单线程收集器,适用于client模型下单cpu内存不大的应用场景、ParNew改进了Serial单线程的不足,升级为多线程,适用于server模式下多cpu,Parallel Scanvage与ParNew类似,不同在于更关注吞吐量,适用于不需要与用户进行交互的场景。
老年代收集器有Serial Old单线程,Parallel Old是Parallel Scanvage的老年代版本,配合使用,构造一个更关注吞吐量的组合,CMS是一个并发的多线程收集器,功能强大。
G1是一款功能强大的收集器,完美收集新生代老年代垃圾。

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

相关推荐

ANSYS-CFX,计算时报错,内存参数报错,return code 1【终极解决方案】

ANSYS-CFX,计算时报错,内存参数报错,return code 1【终极解决方案】 在CFX计算时经常会遇到内存不足的错误报告,有的算例网格并不多也会出现这样的问题,本文就最近遇到的内存错误问题以及解决方法进行简单的总结,以供大家参考。 1 CFX-Solver Manager内存种类 打开Define Run,面板上的Partitioner、Solver、Interpolator选项中分别都有关于内存的设置选项。当出现内存不足错误时,应该设置哪一个选项的内存参数,要看是哪一部分的内存不足。 2 C

深海民工CFDer 3万+

垃圾回收器性能指标

一、分类 1. 线程数 2. 工作模式 并发式垃圾回收器: 垃圾回收器和应用线程交替工作,尽可能减少应用程序的停顿时间 独占式垃圾回收器: STW,一旦运行,就停止应用程序中的所有的用户线程,直到垃圾回收过程完全结束 3. 碎片整理 压缩式垃圾回收器: 会在回收完成后,对存活对象惊醒压缩整理,消除回收后的碎片。指针碰撞来分配新的对象 非压缩式垃圾回收器:不会进行这个步骤,按照空闲列表来进行分配 4. 工作区域 年轻代回收器和老年代回收器 二、性能指标 以下三者组成一个不可能三角 1. 吞

weixin_43374578的博客 750

Python实战:解析腾讯视频M3U8加密链接并下载高清影片

本文详细介绍了如何使用Python解析腾讯视频M3U8加密链接并下载高清影片。从环境准备、抓包分析到核心代码实现,逐步讲解如何获取M3U8主链接、解析TS分片列表以及下载合并视频片段。文章还提供了多线程下载、断点续传和加密视频处理等优化方案,帮助开发者高效完成视频下载任务。

weixin_30836759的博客 525

垃圾回收算法和垃圾回收器

常用垃圾回收算法 标记-清除算法 过程:扫描一遍堆内存,对要清除的对象进行标记,扫描完成之后会一起清除 速度非常快,缺点是会产生大量的空间碎片 标记-复制算法 过程:先将内存区域分成左右两块,右边一块空着,左边来存放对象。在回收的时候,会扫描左边的那一块空间,将要保留的对象复制到右边存储下来,这个存储是有顺序并且排列整齐的,然后清除掉左边区域。 速度慢并且浪费了一半的空间,但是不会产生空间碎片 标记-整理算法 过程:遍历GC Roots,将要保留的对象标记,移动所有需要保留的对象,按

chaim16的博客 377

手把手教你用STM32F103的GPIO模拟MIPI RFFE协议(附完整代码与逻辑分析仪调试技巧)

本文详细解析了如何使用STM32F103的GPIO模拟MIPI RFFE协议,包括协议核心、硬件准备、时序模拟、寄存器操作及逻辑分析仪调试技巧。通过实战代码和波形分析,帮助工程师解决电平转换、奇校验处理等常见问题,提升通信稳定性与效率。

weixin_30292745的博客 284

L3 级自动驾驶 2025:法规突破与车企技术路线竞争

2025年L3级自动驾驶迎来规模化商业落地关键期。全球主要经济体在法规、技术、市场三方面取得突破:中国通过《北京市自动驾驶汽车条例》明确责任划分,欧盟设立严格技术认证标准。技术路线呈现"多传感器融合为主流,纯视觉为补充"格局,华为、特斯拉等企业展开硬件军备竞赛与算法架构革新。中国车企在技术验证和规模化应用方面领先,而欧美车企侧重生态整合。尽管面临成本控制、责任认定和用户信任等挑战,随着技术进步和车路协同发展,L3自动驾驶正从高端选配向大众化普及迈进,为L4级奠定基础。

2301_77933942的博客 3095

JVM 面试问题

响应时间(RT):系统处理请求的时间 吞吐量:单位时间内处理请求的数量 QPS:每秒的响应请求数,也即是最大吞吐能力。 (吞吐量的增大,有时会把平均响应时间作为牺牲,来换取一段时间处理更多的请求) 问题 答案 JVM 内存划分 栈参考: https://blog.youkuaiyun.com/seebetpro/article/details/49202037 ...

爱上在路上 468

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1466

JVM--基础--19.2--垃圾收集器--Parallel Scavenge,Parallel Old

​ JVM–基础–19.5–垃圾收集器–Parallel Old 1、结构图 ​ 2、Parallel Old 收集器 2.1、特征 是Parallel Scavenge收集器的老年代版本,使用多线程和"标记-整理"算法。 参数控制: -XX:+UseParallelOldGC 只能和Parallel Scavenge配合使用,这个组合常用于注重吞吐量以及CPU资源敏感的场合。 2.2、Parallel Scavenge/Parallel Old运行

zhou920786312的博客 837

OMAPL138使用UPP读写测试

UPP测试代码 #include "hw_types.h" // 宏命令 #include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器 #include "soc_OMAPL138.h" // DSP C6748 外设寄存器 #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 #include "interrupt.h" // DSP C6748 中断相关应用程序接...

wangjie36的博客 1192

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

m0_60898338的博客 1118

JVM垃圾收集相关概念

垃圾收集器 Serial串行收集器 serial串行收集器是最基本、历史最长的收集器。 特点:新生代收集器,单线程收集器,在执行GC过程时,会暂定所有用户线程,GC完成之后其他用户线程才能继续执行。 缺点:执行GC过程暂定所有用户线程,如果内存大,垃圾多,GC时间过长,导致系统长时间没有反应,用户体验不好。 适用情况:单cpu情况下,没有线程交互开销,适用于Client模式,如桌面应用场景,分配给虚拟机的内存不会很大,几十到几百兆之间,内存不大时,回收速度会快。 ParNew收集器 将GC线程由单线程变为

bluewaveandy的博客 275

基于YOLOv11的手术器械计数系统:从数据集构建到Web应用部署

m2cai16-tool数据集:包含15种腹腔镜手术器械的标注图像Cholec80数据集:包含80个胆囊切除手术视频,标注了7种器械SurgicalTools数据集:包含超过10,000张手术器械图像,涵盖21类常见器械手术剪(Scissors)止血钳(Hemostat)持针器(Needle Holder)手术刀(Scalpel)镊子(Forceps)拉钩(Retractor)吸引器(Suction)

YOLO 394

【JVM】JVM垃圾收集器:G1垃圾收集器深入解析

在任意一次收集暂停中,CSet所有分区都会被释放,内部存活的对象都会被转移到分配的空闲分区中。在[ 整堆5%, 整堆60% ]的基础上,G1会计算下现在Eden区回收大概要多久时间,如果回收时间远远小于参数-XX:MaxGCPauseMills设定的值(默认200ms),那么增加年轻代的region,继续给新对象存放,不会马上做YoungGC。如果发现全局缓冲区日志积累较多,G1会调用更多的线程来出来缓冲区日志,甚至会调用App Thread 来处理,造成应用任务堵塞,所以必须要尽量避免这样的现象出现。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JVM中有哪些垃圾收集器?

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 新生代垃圾收集器 针对新生代的垃圾收集器共有三个:Serial,Parallel Scavenge 和 Parallel New。 这三个采用的都是标记 - 复制算法。 其中,Serial 是一个单线程的,Parallel New 可以看成 Serial 的多线程版本。 Parallel Scavenge

Shockang的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

码说芯语的博客 2901

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JVM几种常见的垃圾收集器总结

前言 在介绍垃圾收集器之前,首先介绍以下这几个概念 1. Stop-the-world 它是指 JVM 由于要执行 GC 而停止了应用程序的执行,并且这种情形会在任何一种 GC 算法中发生。当 Stop-the-world 发生时,除了 GC 的线程以外,其他的线程均处于等待的状态,直到 GC 任务完成。 实际上,很多 GC 优化都是通过减少 Stop-the-world 的时间来提高程序的性能。...

To be a great coder 9446

JVM之垃圾收集器

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

积跬步,至千里。 819

java 垃圾收集器_Java的垃圾收集器

垃圾收集器是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法、火车算法)的具体实现,不同商家、不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚拟机中的垃圾收集器。下图是java8 HotSpot虚拟机所有的垃圾收集器,连接先代表可也配合使用的组合,G1是对整个堆进行收集用于新生代的收集器有:Serial、ParNew、Paraller Scavenge用于老年...

weixin_29539039的博客 262

jvm垃圾收集器简介

串行垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,Java应用中的所有线程都要暂停,等待垃圾回收的完成。这种现象称之为STW(Stop-The-World),一般的javaweb应用中不会采用这种收集器。

流浪猫 1082

什么是垃圾收集器?Java中有哪些垃圾收集器?

垃圾收集器(Garbage Collector, GC)是Java虚拟机(JVM)中的一个重要组件,它的主要任务是自动管理内存,回收不再被引用的对象所占用的内存空间。Java中的垃圾收集器使开发者无需手动释放内存,从而减少了内存泄漏和内存管理错误的风险。垃圾收集器的基本原理是通过追踪对象的引用情况,识别出那些不再被引用的对象,并回收它们所占用的内存。标记:标记出所有存活的对象。清除:清除未被标记的对象,释放它们的内存。压缩:将存活的对象压缩到内存的一端,以便腾出连续的内存空间,减少内存碎片。

程序员学习园地。 821

HotSpot 垃圾收集器

HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器(单线程) 只开启一条 GC 线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程(Stop The World)。 一般客户端应用所需内存较小,不会...

leon 2万+

垃圾收集器及内存分配

‐XX:+PrintGC 输出GC日志 ‐XX:+PrintGCDetails 输出GC的详细日志 ‐XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) ‐XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013‐05‐04T21:53:59.234+0800) ‐XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息 ‐Xloggc:F://test//gc.log 日志文件的输出路径。(这里是指,并行能力较强的机器)

zhenlong_qu的博客 1193

现代垃圾收集器

大家好,我是你们的花姐。话说java的长期支持版本已经发展到了JDK21,大部分同学对jvm中的垃圾收集器还停留在java8之前的CMS和G1。对java11之后引入的低延迟垃圾收集器shenandoah和zgc几乎是一无所知,甚至有同学是连这两个名字也没有听过呀,嘻嘻。今天我们就一起来解开这两个低延迟垃圾收集器的神秘面纱。

java_green_hand0909的博客 1211
上一篇: LCS
下一篇: 内存分配和回收策略
Violet-Zhao
博客等级 码龄10年 36粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值