JVM频繁Full GC的情况及应对策略

触发JVM进行Full GC的情况及应对策略 Full GC又称作Major GC,属于老年代GC,指发生在老年代的GC,相对这种GC的有新生代GC即Minor GC。出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的,Major GC的速度一般会比Minor GC慢10倍以上。下边看看有那种情况触发JVM进行Full GC及应对策略。   1、System.gc()方法的调用   此方法的调用是建议JVM进行Fu 阅读详情


堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,如下图所示:

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的JDK里默认包括了对永生带即方法区的回收(JDK8中无永生带了),出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的。Major GC的速度一般会比Minor GC慢10倍以上。下边看看有那种情况触发JVM进行Full GC及应对策略。

 

1、System.gc()方法的调用

 

此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。


2、老年代代空间不足


老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError: Java heap space 
为避免以上两种状况引起的Full GC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

3、永生区空间不足


JVM规范中运行时数据区域中的方法区,在HotSpot虚拟机中又被习惯称为永生代或者永生区,Permanet Generation中存放的为一些class的信息、常量、静态变量等数据,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下也会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:
java.lang.OutOfMemoryError: PermGen space 
为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。


4、CMS GC时出现promotion failed和concurrent mode failure


对于采用CMS进行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能

会触发Full GC。
promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;concurrent mode failure是在

执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足造成的(有时候“空间不足”是CMS GC时当前的浮动垃圾过多导致暂时性的空间不足触发Full GC)。
对措施为:增大survivor space、老年代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕

后很久才触发sweeping动作。对于这种状况,可通过设置-XX: CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。


5、统计得到的Minor GC晋升到旧生代的平均大小大于老年代的剩余空间


这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之

前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。
例如程序第一次触发Minor GC后,有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,

则执行Full GC。
当新生代采用PS GC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否

大于6MB,如小于,则触发对旧生代的回收。
除了以上4种状况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC。可通过在启动时通过- java -

Dsun.rmi.dgc.client.gcInterval=3600000来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

 

6、堆中分配很大的对象

 

所谓大对象,是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。

为了解决这个问题,CMS垃圾收集器提供了一个可配置的参数,即-XX:+UseCMSCompactAtFullCollection开关参数,用于在“享受”完Full GC服务之后额外免费赠送一个碎片整理的过程,内存整理的过程无法并发的,空间碎片问题没有了,但提顿时间不得不变长了,JVM设计者们还提供了另外一个参数 -XX:CMSFullGCsBeforeCompaction,这个参数用于设置在执行多少次不压缩的Full GC后,跟着来一次带压缩的。

线上线程池打满,如何优化的?JVM 了解什么? CMS 为什么会有浮动垃圾? 什么时候会进行CMS GC? 什么时候会进行FULL GC?CMS GC和 FULL GC有什么不一样? CMS(Concurrent Mark Sweep)是一种以获取最短回收停顿时间为目标的垃圾收集器。浮动垃圾是指在 CMS 并发标记和并发清除阶段,由于用户线程还在继续运行,可能会产生新的垃圾对象,这些新产生的垃圾对象在本次垃圾回收中无法被回收,只能留到下一次垃圾回收时处理,因此被称为浮动垃圾。JVM(Java Virtual Machine)是 Java 程序的运行环境,它负责加载字节码文件、执行字节码指令、管理内存等。 阅读详情

相关推荐

阿里开源最强数字人工具 EchoMimicV2,本地部署(一)

EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。

缘分天空的专栏 4620

【JVM补充】频繁fullgc的解决思路

背景 最近在整理JVM的知识体系,想到了大家平时都会讨论了一个话题,当然也是面试常问的一个话题,就是发生频繁fullGC的情况,我们应该如何应对,如何找到问题并且如何解决问题,这是让人 头大 的事情。 发现问题 我们先思考一下,我们平时是怎么发现频繁fullgc的,它的表现形式有哪些,这里只列举出来我能想到的几个点,可能还有其他的表现形式。 CPU满载告警 API响应时间过长 内存反复波动 主动GC … 定位问题 ...

言淮的博客 2665

工业模型导入Unity实战:从ProE/SolidWorks到实时渲染的完整流程

在工业仿真、数字孪生和VR/AR应用开发中,将高精度工程模型导入实时渲染引擎是一个常见的技术挑战。其核心原理在于参数化工程软件与实时渲染引擎的数据结构差异:前者基于精确的B-rep边界表示和特征树,后者依赖轻量化的三角网格与材质贴图。这一转换的技术价值在于实现工程数据的可视化与交互化,为产品展示、虚拟培训和工厂仿真等应用场景提供基础。通过数据翻译与优化流程,特别是利用3ds Max或Blender作为中转站进行网格优化与UV展开,能够有效解决模型破面、材质丢失和性能问题。本文聚焦于ProE(Creo)和So

weixin_33050117的博客 345

频繁fullgc竟然是这样造成的?

一次频繁的fullgc排查

weixin_42459814的博客 1693

Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌

AI 数字人直播系统是利用人工智能技术创建虚拟主播,并通过数字化技术实现直播互动的系统1。以下是其相关介绍:Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌。

weixin_ggwwsscc的博客 621

用Python玩转ROS机械臂:YOLO目标检测+MoveIt!自动抓取仿真教程

本文详细介绍了如何利用Python集成YOLO目标检测与ROS的MoveIt!运动规划库,实现机械臂的智能抓取仿真。通过Gazebo仿真环境,从视觉感知、坐标转换到运动规划与执行,构建了一套完整的自动化抓取系统,为机器人视觉抓取应用提供了可复现的实践方案。

ppp33的博客 553

fullgc触发条件_图解JVM实验-触发FullGC的几个条件

1.年轻代存活的对象太多,老年代了放不下01.示例代码public class DemoTest1 { public static void main(String[] args) { byte[] array1 = new byte[4 * 1024 * 1024]; array1 = null;​ byte[] array2 = new byte...

weixin_39750598的博客 960

R语言TCGA数据下载避坑指南:biolinks包实战中的5个常见错误与解决方案

本文详细介绍了使用R语言的TCGAbiolinks包下载TCGA数据时常见的5个错误及其解决方案,包括安装与加载问题、查询构建参数设置、下载中断处理、数据加载格式不匹配以及版本兼容性问题。通过实战案例和代码示例,帮助生物信息学研究者高效获取TCGA数据,避免常见陷阱。

weixin_30892037的博客 84

一次性能测试中JVM频繁Full GC的解决经验总结

问题现象 最近对平台功能进行性能优化。功能完成后,开始在环境进行长稳测试。使用模拟客户端以每秒15000TPS向系统发送请求,结果发现系统性能总是保持一段时间后开始下降,最坏的情况只有8000到9000TPS左右,之后开始上升下降反复来回。 问题分析 系统由java编写,性能...

zhangfengaiwuyan的专栏 1万+

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

算法大师! 511

VN1640 CH5 I/O通道终极指南:【从硬件原理—>工程实战—>自动化测试实战】

摘要:本文详细解析Vector VN1640 CH5 I/O通道的硬件原理与工程应用,涵盖模拟输入(AIN)、数字输入(DIN)和数字输出(DOUT)三大功能模块的配置指南。通过硬件隔离设计实现高精度信号采集与驱动控制,重点分析开漏输出特性及保护机制。提供PWM控制、ECU上电时序测试、传感器闭环控制等实战案例的CAPL脚本代码,并强调多设备同步采集的精准性(时间偏差<1µs)。适用于汽车电子HIL测试、ECU信号监测等场景,所有方案均通过实际项目验证。

汽车控制器系统开发、VIL测试、HIL测试、MIL测试、EMS电喷系统标定与开发、热管理系统标定 760

如果JVM出现频繁Full GC该如何解决

频繁Full GC不是你的错,但放任不管就是你的锅。把它当作一个“预警信号”,提醒你优化代码、合理配置。记住:JVM不是敌人,它是你系统的“清洁工”,只要善待它(写干净代码、合理配置),它就会默默守护你的系统,让你远离半夜加班的烦恼。最后送大家一句口诀:“内存泄漏要警惕,大对象别乱堆,GC参数调到位,监控预警不能睡。代码写得清爽,系统自然不崩溃!互动话题:你遇到过最奇葩的Full GC原因是什么?评论区分享你的“血泪史”!

DKPT的博客 1299

【异常】Cursor 编辑器 “Too many computers“ 报错排查与完整解决方案

该报错通常在启动Cursor、调用AI对话/代码补全核心功能时触发,会直接阻断编辑器AI能力的正常使用。

奶爸的编程之路,也就一周冷个三天 463

JVM Full GC 优化指南

摘要:频繁Full GC会导致应用暂停,影响服务稳定性。本文提供系统化排查流程:1)通过堆转储分析内存泄漏;2)调优JVM参数,包括堆内存分配、GC器选择和元空间配置;3)代码优化如避免大对象、及时释放资源。配套介绍了jmap、MAT等工具的使用方法,并附流程图指导问题定位。建议优先解决内存泄漏,再针对性调整参数,从根源减少GC问题。

qq_39126115的博客 1635

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java_JVM- Full GC 频繁解决

相关文章: 一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程 https://blog.youkuaiyun.com/cml_blog/article/details/81057966 JVM频繁Full GC的情况及应对策略 https://blog.youkuaiyun.com/wangshuminjava/article/details/80907129 原文...

迎难而上 2883

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Full GC频繁发生怎么办?:快速诊断与应急处理全流程详解

快速定位并解决Full GC频繁问题,提供java jvm调优实战中的诊断流程与应急方案,涵盖GC日志分析、内存泄漏排查及参数优化策略,适用于高并发生产环境,提升系统稳定性,值得收藏。

InitFlow的博客 991

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spark GC调优实战:从频繁Full GC到稳定运行的完整指南

通过本次对Spark应用中GC调优的完整探讨,我们不难发现,从频繁Full GC到系统稳定运行并非一蹴而就,而是一个需要持续观察、分析、迭代的过程。G1GC作为当前主流的高效垃圾回收器,虽然具备自适应、低停顿等优势,但其性能极大程度上依赖于合理的参数配置以及对系统实际负载的深刻理解。我们通过日志分析识别瓶颈,通过参数调优平衡吞吐量与延迟,最终实现了系统资源的有效利用。然而,调优不是终点,而是一个新的起点。在生产环境中,业务数据量、计算模式及集群规模都可能动态变化,这意味着GC行为也需要随之调整。

zuiyuelong的博客 1076

JVM频繁FullGC:面试通关“三部曲”心法

想象一下,你的Java应用程序是一个繁忙的工厂,JVM堆内存就是工厂的仓库和车间。垃圾收集(GC)就像工厂的清洁工,负责清理不再需要的废料(无用对象),腾出空间让新的生产(对象分配)继续。Minor GC(年轻代GC)像是日常小范围清洁,速度快,影响小。而Full GC(完全垃圾收集,通常涉及老年代和整个堆)则是一次彻底的、停工级别的大扫除,耗时长,会导致工厂所有生产线(应用线程)暂停(Stop-The-World, STW)。如果你的工厂频繁地进行这种“停工大扫除”,那问题就大了!

m0_73762612的博客 1200

JVM调优实战:从Full GC频繁到CPU飙高的排查与优化

Java虚拟机(JVM)作为Java应用的核心运行时环境,其内存管理与垃圾回收机制直接影响着应用的性能与稳定性。理解JVM内存模型与垃圾回收原理,是进行性能优化的基础。通过建立可观测性体系,监控堆内存使用率、GC频率与耗时等关键指标,结合GC日志与线程快照分析,可以精准定位性能瓶颈。在工程实践中,针对Full GC频繁、内存泄漏、CPU负载高等常见问题,采取假设驱动的分析流程,能够有效提升系统吞吐量与响应速度。本文聚焦于JVM调优实战,深入探讨了如何通过参数调整与工具使用,解决线上环境中的性能问题,其中涉及

482

为什么你的Java应用总是卡顿?:深入剖析JVM停顿原因与应对策略

解决Java应用卡顿难题,深入解析JVM停顿根源。结合java jvm调优实战经验,覆盖GC优化、内存分配与线程调优策略,提升系统稳定性与性能表现。适用于高并发、低延迟场景,值得收藏。

CodeIsle的博客 1103

每天一道面试题之架构篇|线上频繁Full GC排查实战指南

Full GC(完全垃圾回收)是Java应用性能的"红色警报",频繁发生会导致应用暂停、响应变慢,严重影响用户体验。掌握Full GC排查是高级工程师的必备技能。

sjkflw121150的博客 586
上一篇: 一次线上服务fullGC原因排查
下一篇: fullGC过于频繁的原因和解决方案
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值