JVM GC垃圾回收器详解

《JVM系列,tomcat面试题汇总 ParNew收集器可以看作时Serial收集器的多线程版本。Par是Parallel的缩写,New:只能处理的是新生代。ParNew 收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间几乎没有任何区别。ParNew收集器在年轻代中同样也是采用复制算法、"Stop-the-World"机制。 ParNew 是很多JVM运行在Server模式下新生代的默认垃圾收集器。 对于新生代,回收次数频繁,使用并行方式高效。 对于老年代,回收次数少,使用串行方式节省资源。(CPU并行需要切换线程,串. 阅读详情

http://blog.youkuaiyun.com/java2000_wl/article/details/8030172点击打开链接

HotSpot JVM收集器

              上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。

Serial(串行GC)收集器

Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

ParNew(并行GC)收集器

ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial收集器一样。

Parallel Scavenge(并行回收GC)收集器

Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的收集器,又是并行多线程收集器。parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量= 程序运行时间/(程序运行时间 + 垃圾收集时间),虚拟机总共运行了100分钟。其中垃圾收集花掉1分钟,那吞吐量就是99%。

Serial Old(串行GC)收集器

Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。

Parallel Old(并行GC)收集器

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

CMS(并发GC)收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于“标记-清除”算法实现的,整个收集过程大致分为4个步骤:
①.初始标记(CMS initial mark)
②.并发标记(CMS concurrenr mark)
③.重新标记(CMS remark)
④.并发清除(CMS concurrent sweep)
     其中初始标记、重新标记这两个步骤任然需要停顿其他用户线程。初始标记仅仅只是标记出GC ROOTS能直接关联到的对象,速度很快,并发标记阶段是进行GC ROOTS 根搜索算法阶段,会判定对象是否存活。而重新标记阶段则是为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会被初始标记阶段稍长,但比并发标记阶段要短。
     由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以整体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS收集器的优点:并发收集、低停顿,但是CMS还远远达不到完美,器主要有三个显著缺点:
CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户线程停顿,但是会占用CPU资源而导致引用程序变慢,总吞吐量下降。CMS默认启动的回收线程数是:(CPU数量+3) / 4。
CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure“,失败后而导致另一次Full  GC的产生。由于CMS并发清理阶段用户线程还在运行,伴随程序的运行自热会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在本次收集中处理它们,只好留待下一次GC时将其清理掉。这一部分垃圾称为“浮动垃圾”。也是由于在垃圾收集阶段用户线程还需要运行,
即需要预留足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,需要预留一部分内存空间提供并发收集时的程序运作使用。在默认设置下,CMS收集器在老年代使用了68%的空间时就会被激活,也可以通过参数-XX:CMSInitiatingOccupancyFraction的值来提供触发百分比,以降低内存回收次数提高性能。要是CMS运行期间预留的内存无法满足程序其他线程需要,就会出现“Concurrent Mode Failure”失败,这时候虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了。所以说参数-XX:CMSInitiatingOccupancyFraction设置的过高将会很容易导致“Concurrent Mode Failure”失败,性能反而降低。
最后一个缺点,CMS是基于“标记-清除”算法实现的收集器,使用“标记-清除”算法收集后,会产生大量碎片。空间碎片太多时,将会给对象分配带来很多麻烦,比如说大对象,内存空间找不到连续的空间来分配不得不提前触发一次Full  GC。为了解决这个问题,CMS收集器提供了一个-XX:UseCMSCompactAtFullCollection开关参数,用于在Full  GC之后增加一个碎片整理过程,还可通过-XX:CMSFullGCBeforeCompaction参数设置执行多少次不压缩的Full  GC之后,跟着来一次碎片整理过程。

G1收集器

G1(Garbage First)收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。还有一个特点之前的收集器进行收集的范围都是整个新生代或老年代,而G1将整个Java堆(包括新生代,老年代)。

垃圾收集器参数总结

-XX:+<option> 启用选项
-XX:-<option> 不启用选项
-XX:<option>=<number> 
-XX:<option>=<string>
参数描述

-XX:+UseSerialGC

Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收
-XX:+UseParNewGC打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收
-XX:+UseConcMarkSweepGC使用ParNew + CMS +  Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
-XX:+UseParallelGCJvm运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge +  Serial Old的收集器组合进行回收
-XX:+UseParallelOldGC使用Parallel Scavenge +  Parallel Old的收集器组合进行回收
-XX:SurvivorRatio新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden:Subrvivor = 8:1
-XX:PretenureSizeThreshold直接晋升到老年代对象的大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
-XX:MaxTenuringThreshold晋升到老年代的对象年龄,每次Minor GC之后,年龄就加1,当超过这个参数的值时进入老年代
-XX:UseAdaptiveSizePolicy动态调整java堆中各个区域的大小以及进入老年代的年龄
-XX:+HandlePromotionFailure是否允许新生代收集担保,进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留
-XX:ParallelGCThreads设置并行GC进行内存回收的线程数
-XX:GCTimeRatioGC时间占总时间的比列,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge 收集器时有效
-XX:MaxGCPauseMillis设置GC的最大停顿时间,在Parallel Scavenge 收集器下有效
-XX:CMSInitiatingOccupancyFraction设置CMS收集器在老年代空间被使用多少后出发垃圾收集,默认值为68%,仅在CMS收集器时有效,-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSCompactAtFullCollection
由于CMS收集器会产生碎片,此参数设置在垃圾收集器后是否需要一次内存碎片整理过程,仅在CMS收集器时有效
-XX:+CMSFullGCBeforeCompaction
设置CMS收集器在进行若干次垃圾收集后再进行一次内存碎片整理过程,通常与UseCMSCompactAtFullCollection参数一起使用
-XX:+UseFastAccessorMethods
原始类型优化
-XX:+DisableExplicitGC
是否关闭手动System.gc
-XX:+CMSParallelRemarkEnabled
降低标记停顿
-XX:LargePageSizeInBytes
内存页的大小不可设置过大,会影响Perm的大小,-XX:LargePageSizeInBytes=128m


Client、Server模式默认GC


新生代GC方式老年代和持久代GC方式

Client

Serial 串行GCSerial Old 串行GC
ServerParallel Scavenge  并行回收GCParallel Old 并行GC


Sun/oracle JDK GC组合方式


新生代GC方式老年代和持久代GC方式

-XX:+UseSerialGC

Serial 串行GCSerial Old 串行GC
-XX:+UseParallelGCParallel Scavenge  并行回收GCSerial Old  并行GC
-XX:+UseConcMarkSweepGCParNew 并行GCCMS 并发GC
当出现“Concurrent Mode Failure”时
采用Serial Old 串行GC
-XX:+UseParNewGCParNew 并行GCSerial Old 串行GC
-XX:+UseParallelOldGCParallel Scavenge  并行回收GCParallel Old 并行GC
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
Serial 串行GCCMS 并发GC 
当出现“Concurrent Mode Failure”时
采用Serial Old 串行GC


JVM垃圾回收器全面解析:从核心概念到选型指南 JVM内存调优的本质是平衡吞吐量、延迟和内存占用三者关系。调优效果 = 数据驱动分析 × 合理参数调整 × 代码优化准确识别各内存区域的问题熟练使用JDK工具链进行诊断制定针对性的优化方案建立完整的调优方法论最后忠告:没有银弹参数,只有最适合业务的配置! 阅读详情

相关推荐

深入解析JVM垃圾回收机制:从GC算法到实战调优

JVM垃圾回收机制自动管理Java堆内存中的对象,通过定期回收不再使用的对象来释放内存空间。垃圾回收器(GC)是这一机制的核心组件,它负责识别并回收垃圾对象。JVM垃圾回收机制是Java开发中的重要组成部分,它直接影响到应用的性能和稳定性。通过深入理解GC算法和垃圾回收器的工作原理,以及掌握实战调优技巧,开发者可以更好地优化Java应用的内存管理,提高应用的性能和响应速度。希望本文能够帮助开发者更好地掌握JVM垃圾回收机制,为Java开发之路打下坚实的基础。

shejizuopin的博客 996

Java虚拟机学习 - 垃圾收集器

HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。 Serial收集器 Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个...

爱.NET 440

提升JVM性能:CMS垃圾回收器的优化分析与案例研究

本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记,分析了可能导致性能瓶颈的因素如停顿时间过长和内存碎片化。文章还分享了调整垃圾回收参数、结合其他垃圾回收器以及内存优化等方法,帮助提高CMS的回收效率和性能。最后,文章展望了随着JVM发展,结合新一代垃圾回收器优化的趋势,助力Java应用在高并发环境下的性能提升。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

垃圾回收器-CMS及常用回收器分析

1.cms、g1和zgc其实原理差不多2.cms标记整理时,会扫描直接引用对象 如 new A();但不去扫描a里面的其他引用对象3.为什么csm初始标记时要stw,不停一直有新增标记不完4..jvm在3g以上才适合cms5.在cms并发标记的时候会出现初始标记的对象发生了改变,这时就需要进行重新标记(采用三色标记增量算法)。重新标记后,进入到并发清理阶段(在该阶段如果来了一个不需要清理但无标记的对象,会不会被误删?...

全场梦游c的博客 1697

Zoom AI 技术架构研究:联合式方法与多模态集成

通过 Zoom AI 开放平台,企业可以自定义 AI 模块 (如法律合规审查、客户反馈分析),扩展应用场景。这种开放平台策略使企业能够根据自身需求定制 AI 功能,满足特定业务需求。

shao.bing的专栏 1317

别再乱改grub.cfg了!手把手教你用GRUB2自定义多系统启动菜单(含UEFI/BIOS双模式配置)

本文详细介绍了如何安全、高效地使用GRUB2自定义多系统启动菜单,涵盖UEFI/BIOS双模式配置。通过避免直接编辑grub.cfg文件,采用正确的配置方法和命令,帮助用户打造稳定且美观的启动环境,特别适合Linux多系统用户和开发者。

weixin_42553471的博客 590

RocketMQ异常:‘UseCMSCompactAtFullCollection‘

前言

Person_two的博客 6539

FFmpeg实战:SEI自定义数据在RTMP推流中的高效嵌入

本文深入探讨了如何利用FFmpeg在RTMP推流中高效嵌入SEI自定义数据。通过将SEI比作与视频帧同步的“小纸条”,文章详细解析了H.264码流中SEI的结构与位置,并提供了命令行与API编程两种实战方法,帮助开发者实现直播答题、AI元数据回传等场景下的帧级精准数据同步。

weixin_29304021的博客 325

JVM——垃圾回收器(GC)详解(一文搞懂垃圾回收器)

JVM——垃圾回收器(GC)详解(一文搞懂垃圾回收器)

xdx_dili的博客 8388

LLMOps的崛起:如何利用Langfuse和Opik构建高效的模型监控与评估体系

本文探讨了LLMOps的崛起,详细介绍了如何利用Langfuse和Opik构建高效的模型监控与评估体系。通过开源工具Langfuse的全景监控方案和Opik的三层评估体系,帮助AI工程团队实现大语言模型的全生命周期管理,提升模型性能和迭代效率。文章还提供了实战技巧和工具链集成方案,助力企业优化AI应用。

ll5678的博客 680

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法。

kevin1499的博客 1617

JVM 全量垃圾回收器(GC)详解

JVM垃圾回收器核心知识点摘要: 分代模型:新生代(复制算法)和老年代(标记清除/整理算法)构成GC设计基础。 回收器分类: 按区域:新生代(Serial/ParNew/ParallelScavenge)、老年代(SerialOld/ParallelOld/CMS)、整堆(G1/ZGC) 按执行方式:串行(单线程STW)、并行(多线程STW)、并发(GC与应用线程并行) 核心指标:吞吐量(后台任务优先)与停顿时间(在线业务优先)的权衡。 企业选型: JDK8默认:ParallelScavenge+Paral

萧曳丶 732

OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)

上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。 OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

JVM内存模型,GC垃圾回收器与回收算法详解

以具体案例带你深入理解JVM内存模型,对象存储与回收

在路上 812

用 CDS 作为 Referenced Data Source 开发 SAP Gateway OData 服务,一条更轻的 SEGW 路线

本文介绍了SAP Gateway项目中从传统手工建模到基于CDS View的现代化开发方式转变。主要内容包括: 传统方式需要在SEGW中手动创建Entity Type、Entity Set等元素,并在DPC_EXT中编写大量查询逻辑,存在模型层和业务逻辑重复表达的问题。 7.50版本后,SAP Gateway与ABAP CDS深度集成,可通过SEGW直接引用CDS View作为数据源,自动生成数据模型和SADL读取逻辑,支持完整的OData查询功能。 最佳实践建议通过Consumption View而非直接

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 706

但是我如果真的用差速轮去控制转向 为了尽量原地旋转 转向角度精确 我应该怎么去配置左右两个轮子的速度呢

目标实现方式原地转向左右轮速度相等、方向相反精确角度用 IMU 检测 yaw 实时对齐停止判断达到目标 yaw ± 容差时立即停转控制方式状态机(idle → turning → done)推荐容差2°~3° (可根据实际调整)

qqqweiweiqq的博客 312

JVM的详细笔记1.5W字 包含结构 stringtable 堆栈方法区详解 垃圾回收算法 GC 垃圾回收器 类加载

在 JDK 1.7 及以前,方法区的实现被称为永久代(PermGen),它是堆的一个逻辑部分。永久代中存储了类的元数据、字符串常量池等信息。但是永久代有大小限制,容易出现(如加载大量类时可能导致永久代溢出)。在 JDK 1.8 及以后,方法区的实现改为元空间(MetaSpace)。元空间不再在堆中,而是使用本地内存(Native Memory),而且没有设置上限。这意味着元空间的大小不再受限于 Java 堆的大小,理论上只受限于系统的可用内存,减少了因类加载过多导致的内存溢出问题。

2405_82537153的博客 1887

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JVM 垃圾回收器(Garbage Collector, GC 收集器)

垃圾回收器(GC)是 JVM 中的内存管理模块,负责自动回收不再被引用的对象,避免内存泄漏和内存溢出。👉核心目标:自动化内存管理、提升系统性能、减少开发者手动干预。GC 收集器适用场景特点Serial单核、Client端简单稳定,单线程ParNew多CPU中配合CMS多线程,低停顿Parallel高吞吐后台、大数据吞吐优先,多线程CMS低延迟Web系统并发回收,内存碎片多G1大内存服务端分区,低停顿,预估时间金融、直播、低延迟场景几乎无停顿,支持大堆1️⃣CMS 的优缺点?

m0_69529796的博客 984

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

蓝牙模块HM-10手册

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

java垃圾回收文档整理

GC和GC Tuning 作者:马士兵教育 http://mashibing.com GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出两种类型的问题: 忘记回收 多次回收 没有任何引用指向的一个对象或者多个对象(循环引用) 2.如何定位垃圾 引用计数(ReferenceCount) 根可达算法(RootSearching) 3.常

文盲青年的博客 324

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

一文看懂JVM内存布局及GC原理

景,很多网上的旧文章已经跟不上的变化。本文详细介绍了java的内存布局以及各种垃圾回收器的原理(包括的ZGC),希望阅读完后,大家对这方面的知识不再陌生,有所收获,同时也欢迎大家留言讨论。   一、JVM运行时内存布局 按java 8虚拟机规范的原始表达:(jvm)Run-Time Data Areas, 暂时翻译为“jvm运行时内存布局”。   从概念上大致分为6个(逻辑)区域,参考下图。注:Method Area中还有一个常量池区,图中未明确标出。   这6块区域按是否被线程共

hebeind100的博客 256

JVM(8)——GC的影响(总结)

1.基于JVM运行的系统最怕什么? 基于JVM运行的系统最害怕的问题:**系统卡顿问题!**就是每次一旦年轻代塞满之后,在进行垃圾回收的时候,这个期间都必须停止系统程序的运行! 2.年轻代gc到底多久一次对系统影响不大? 通常来说是不大的,假如说你的系统运行着,然后每隔几分钟或者几十分钟执行一次新生代gc,系统卡顿几十毫秒,就这期间的请求会卡顿几十毫秒,几乎用户都是无感知的,所以新生代gc一般基本...

m0_37604110的博客 5558

深入解析JVM垃圾回收器:原理、实践与调优指南

垃圾回收是指自动管理程序运行时内存的分配和释放过程。在Java中,开发者不需要手动释放对象占用的内存,JVM会自动识别并回收不再使用的对象。作为Java开发者,理解JVM垃圾回收器的工作原理和调优方法对于构建高性能应用至关重要。对于传统单体应用,G1是不错的选择对于追求极致低延迟的场景,考虑ZGC或Shenandoah对于资源受限的环境,Serial或Parallel可能更合适记住,没有"最好"的垃圾回收器,只有"最适合"的垃圾回收器。良好的监控和持续的调优才是保证系统稳定运行的关键。

fw150104010012的博客 943

JVM 性能调优与 G1 GC 优化实践

在进行线上调优时,首先需要准确分析问题类型,识别性能瓶颈。分析 GC 日志:通过分析 GC 日志,观察 GC 停顿时间、频率、回收效果等指标,识别是否存在长时间的 GC 停顿或频繁的 Full GC。检查垃圾未回收的原因:在发现 GC 停顿或 Full GC 频繁的情况下,进一步分析是哪个阶段的垃圾回收未被充分触发。年轻代回收不足:可能由于设置过小,导致年轻代频繁溢出到老年代,增加老年代的垃圾回收压力。老年代增长过快:如果设置过低,可能导致对象提前晋升到老年代,增加 Full GC 的频率。

qq_36392309的博客 1465

Java垃圾回收机制(GC)详解----垃圾回收GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部

aukawa的专栏 446
上一篇: jvm 性能调优案例和GC 垃圾回收器详细说明。
下一篇: JVM JAVA的自带小工具
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值