JVM出现连续的FullGC该怎么办?

记一次频繁fullgc排查到解决全流程复盘 阿里云oss文件上传导致的频繁fullgc问题排查到解决全流程复盘 阅读详情

前言

之前已经介绍了下使用GCeasy来通过图形化界面的形式分析GC日志,下面将转载一篇写的比较好的关于FullGC的文章,介绍了线上JVM连续出现FullGC的场景以及解决方案。

转载文章

FullGC是垃圾回收过程中一个非常重要的事件。当发生FullGC的时候,垃圾收集器为了回收更多的垃圾对象,它会从JVM的所有内存中回收垃圾(Young、Old、Perm、Metaspace)。FullGC有很多个步骤,有些步骤需要暂停所有的应用线程,在这个过程中JVM是无法处理用户的请求的。JVM会使用所有的CPU来做垃圾回收,因此CPU的利用率会非常高。所以一般是非常不希望应用中出现FullGC,更别说是连续的FullGC了。连续的FullGC会导致以下问题:
1.CPU利用率飙升
2.由于应用暂停导致应用的响应时间变长,这会影响服务的可用性和用户体验。
本文就来探讨下连续的FullGC相关的话题,什么是FullGC?是如何引起的?如何来解决它。

什么是连续的FullGC?
通过例子来说下会比较简单,首先来看一个经历了FullGC的真实应用的GC日志。下面是由GCeasy分析日志得出的GC堆使用图:注意图中的高亮部分,可以看到发生了连续的FullGC(图中红色的小三角就是FullGC),如果出现了FullGC说明应用出问题了。
在这里插入图片描述
从下面回收字节数的图中可以看出来,即使是经过了FullGC,JVM还是没有回收足够多的内存。因为回收的字节数非常少,可能是大部分对象都是正在使用的活跃对象,因此无法被JVM回收。
在这里插入图片描述

什么原因导致了连续的FullGC?

导致连续的FullGC主要只有一个原因:JVM的堆内存不够用或者是Perm、Metaspace内存不够用,说明应用需要比你分配的内存更多的内存。通俗地说就是小马拉大车。所以JVM必须要努力的去清理垃圾来给存活的对象分配空间。

你可能会想,我的应用已经好好的跑了很长时间了,为什么忽然就发生连续的FullGC了?这是个好问题,可能是因为以下原因:

1.可能是自从上次调优JVM的内存以后,应用的流量忽然变大了!可能是业务量增加了,用户数量变多了。

2.在业务峰值期间应用创建了比平时更多的对象,可能你并没有对峰值时候的应用内存做调优,或者是说应用峰值时候的流量变大了。

如何来解决连续的FullGC?

主要有以下几个方法:

1.增加JVM的堆内存。
因为连续的FullGC主要是由于内存不足引起的,增加JVM的堆内存可以解决这个问题。比如之前给应用分配的是2.5G的堆内存,现在增加到3G看能否解决问题,通过给JVM传递-Xmx参数可以设置JVM的最大堆内存。-Xmx3G就设置了JVM的最大堆内存是3G。如果还是没解决问题,一点点的继续增加JVM的堆内存。不要给JVM分配过多的堆内存,因为这会增加GC的停顿时间。

2.增加Perm或者Metaspace内存
如果Perm区或者是Metaspace太小也会导致连续的FullGC,这种情况下就需要增大Perm或者是Metaspace的内存。

3.增加更多的JVM实例
另一个解决此问题的办法就是增加更多的JVM实例。当有更多的JVM实例以后,应用流量就会分摊到这些实例上,单个JVM承担的流量就降低了,那么它上面需要创建的对象随之也变少了,此时可能就不会有连续的FullGC了。

验证解决办法

如论你是用哪种办法来解决这个问题,在应用到生产环境之前一定要在测试环境做好测试,因为任何对JVM对内存设置的改变都需要进行充分的测试和验证才可以,要确保不会引起其他问题。

转载原文:
https://mp.weixin.qq.com/s/S116BZtPmLS1e1e9voEpbA
英文原文:
https://blog.gceasy.io/2016/11/22/eliminate-consecutive-full-gcs/

记一次生产频繁发生FullGC问题 因为最近这个接口调用量是翻倍了,所以我就去检查了下慢SQL,发现确实是有较多的慢SQL,所以我就缩减了查询的时间范围,但是效果并不好。经过上面问题的排查,造成hooks大对象的原因找到了,就是每次调用接口的时候,都会往hooks里面put一个对象。过了一会发现,这个服务fullGC是有问题的,太频繁了,这个应该是导致接口超时的根本问题,因为时间也是对的上的。对比一下,就不难发现,fullGC数量是从3月15号晚上9点开始增加的,也是这个接口对外开放的时间。2、根据dump文件,分析出堆内对象的分布情况。 阅读详情

相关推荐

一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程

对于JVM垃圾回收,之前一直都是处于理论阶段,就知道新生代,老年代的晋升关系,这些知识仅够应付面试使用的。前一段时间,线上服务器的FullGC非常频繁,平均一天40多次,而且隔几天就有服务器自动重启了,这表明的服务器的状态已经非常不正常了,得到这么好的机会,当然要主动请求进行调优了。未调优前的服务器GC数据,FullGC非常频繁。 首先服务器的配置非常一般(2核4G),总共4台服务器集群。每...

believer123的专栏 3万+

频繁GC问题

过大的内存分配会导致GC花费更多的时间来回收内存,过小的内存分配则会导致更频繁的GC触发,以回收短期内不再使用的对象。运行时间过长:如果应用程序运行时间较长,堆中的对象会逐渐增加,GC可能会更频繁地进行,尤其是在垃圾回收器进行Full GC时,会导致长时间的停顿。长时间的请求处理:对于Web应用程序或服务器,如果请求处理时间过长,可能会导致堆内存中的对象积累较多,增加了GC的压力。综上所述,优化GC的频繁发生需要综合考虑应用程序的实际情况和特点,结合合适的调优策略,以提高应用程序的性能和稳定性。

kankan_s的专栏 2758

FastDDS之共享内存

transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。

u010378559的博客 3084

java8 matespace_JDK8记FullGC时候Metaspace内存不会被垃圾回收

本文链接:https://blog.youkuaiyun.com/a15939557197/article/details/90635460背景前段时间有一个这样的需求:第三方调用接口,30分钟内调用120W次;物理机(与线上配置一样)上压测,第一次压了20w次,没有出现问题;接着又压了20w次,出现了内存溢出问题。java.lang.OutOfMemoryError: MetaspaceJVM配置JAVA_...

weixin_39838362的博客 873

傻白入门芯片设计,SystemVerilog Assertion(SVA)学习(二十一)

对SVA(SystemVerilogt Assertion)有了更深刻的认识,对经典的AveMC形式验证工具进行了介绍

qq_46675545的博客 8470

Python多进程实战:用BaoStock高效下载股票历史数据的5个优化技巧

本文详细介绍了使用Python多进程技术通过BaoStock高效下载股票历史数据的5个优化技巧。从理解BaoStock的数据获取机制到进程池配置、智能任务分片、异常处理及性能监控,帮助开发者显著提升数据下载效率,特别适合量化交易领域的数据采集需求。

weixin_30369041的博客 454

使用大数组对JVM的影响

目录1、难以分配内存2、大对象直接分配在老年代3、容易触发Full GC 1、难以分配内存 数组可以通过下标快速访问元素,是因为它的内存地址是连续的。 绝大多数JVM管理内存的方式,并不是指针碰撞,而是空闲列表。 这就意味着,堆中可用内存空间相对比较分散,存在大量内存碎片,JVM要为大数组分配一块连续的内存空间是比较困难的。 借用网友的两张图说明。 2、大对象直接分配在老年代 数组也是对象,且数组越大,对象占用的空间越大。 如果大对象直接分配在新生代,首先会导致JVM为其他小对象难以分配内存,过早的

程序员小潘 3942

DC/DC恒压输出控制原理与应用

DC/DC恒压输出控制

propor的专栏 4276

纯干货:大对象导致FullGC频繁的原因及实践思路

今天在检查线上环境的时候,发现了在2分钟内出现了2次FullGC。 虽然对线上功能影响不是很大,但还是想一探究竟。 线上监控得到的信息: 可以看到从短时间内有了2次GC,从13次直接飙到15次。 然后看了下老年代的堆情况: 可以看到这两次分别从620M直接下降到了400M然后又下降到了200M的样子。 脑海中的直觉应该是出现了大对象的感觉,因为老年代的堆是650M。达到620M触发GC,可能是...

长沙要起风了、 7234

Vivado FIR Complier_IP核使用方法

文章依靠该IP核对应手册PG149写的,因为笔者需求简单,没有深入挖掘功能,可以自行下载学习。

2302_80180551的博客 3980

QCC304x系列开发教程(实战篇)之5.2 QCC3040之提示音

earbud_init.c中,初始化table中UiPrompts_Init /*! \brief Table of initialisation functions */ static const init_table_entry_t appInitTable[] = { ......... {UiPrompts_Init, 0, NULL}, ......... } ui_prompts.c中是提示音音处理的主要逻辑和配置源文件 函数static void uiPro...

心跳包的博客 2390

JVM空间分配担保流程

JVM空间分配担保流程 在进行Minor GC之前,JVM首先会检查【老年代最大连续空闲空间】是否大于【当前新生代所有对象占用的总空间】 如果是,那么说明此次的Minor GC是安全的,可以放心的进行Minor GC 如果不是,则JVM会去查看HandlePromotionFailure参数的值是否为true(表示是否允许担保失败) 如果不允许担保失败,则此时就会进行一次Full GC 以腾出老年代更多的空间 如果允许担保失败,则此时JVM会去检查【老年代最大连续空闲空间】是否大于【历次晋升到老年代的对

wenpan的博客 3238

SAP 实施:Waterfall vs. Agile —— 一场“结构性矛盾“的深刻比较先说结论:在 SAP 世界里,这从来不是“谁更好“的宗教问题,而是“你的项目 DNA 是什么“的战略选择。​

SAP 实施:Waterfall vs. Agile —— 一场"结构性矛盾"的深刻比较 先说结论:在 SAP 世界里,这从来不是"谁更好"的宗教问题,而是"你的项目 DNA 是什么"的战略选择。​ SAP 早已用 SAP Activate​ 给出了官方态度——它不是纯 Agile,也不是回头去搞旧 Waterfall,而是一个带质量门的混合架构。 1. 先回到本质:两者解决的是不同维度的风险 维度 Waterfall(传统 ASAP 路线)​ Agile(SCRUM/Kanban 式迭代)​

金牌架构师 336

记录一次线上GC问题和原因分析,FullGC到一定次数就停止FullGC

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33769125的博客 700

Vue2 - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,vue实现vr看720度全景效果方案讲解及示例代码(兼容电脑PC网页+手机H5移动端页面)

vue全景VR图,vue h5实现全景720预览,vue加载720全景图_vue怎么加载vr图片,vue实现vr全景看房,vue2实现全景效果,加载很慢卡怎么办,实现全景预览的插件,vue显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于vue实现vr全景预览,加载全景图,vue全景预览pannellum插件,vue实现3D全景图,实现720°全景图展示,在VUE 中使用three.js实现全景视频播放,vue项目中使用photo-sphere-viewer实现vr720度

🏆 前端领域优质创作者 3315

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

第11篇:FullGC深度解析——当老年代也撑不住的时候

本文深入解析JVM中的FullGC机制,将其与MinorGC进行对比,指出FullGC是对整个堆内存的完整回收,具有耗时长、影响大的特点。文章详细列举了FullGC的7种触发条件,包括显式调用System.gc()、老年代空间不足、元空间不足等。针对不同垃圾回收器(CMS、G1、Parallel Scavenge),分别剖析了FullGC的执行过程和退化机制,解释了为何某些情况下会退化为更耗时的单线程回收。最后强调FullGC是JVM性能调优的重点关注对象,理解其触发条件和执行机制有助于优化系统性能。

2503_90542405的博客 1021

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM几种GC的区别

JVM的GC主要有以下几种: Minor GC Major GC Full GC 1.MinorGC 年轻代是所有新对象产生的地方,当年轻代内存空间不够用时就会触发MinorGC. 年轻代区域的内存特点: 年轻代的内存分为:Eden:From survivor:To survivor = 8:1:1 大多数新建的对象都在Eden区,当Eden区被占满时就会触发MinorGc,把存活下...

Brian_wang__的博客 1137

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

为什么JVM中的新生代要有两个Survivor区?

转自https://blog.youkuaiyun.com/antony9118/article/details/51425581 那么,在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? 1 为什么要有Survivor区 先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪里? 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC

m0_67393157的博客 313

JVM Minor GC 与 FullGC 的触发时机

介绍 GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从GC ROOT开始,把所有可以搜索得到的对象标记为存活对象。 GC机制 要准确理解Java的垃圾回收机制,就要从:“什么时候”,“对什么东西”,“做了什么”三个方面来具体分析。本文主要是分析下什么时候触发 GC(Minor GC 与 Full GC) “什么时候”即就是GC触发的条件? GC触发的条件有两种

wangxuelei036的博客 9467

[JVM面试]Full GC 到底是如何产生的?如何解决?

点击上方“Coder编程”,选择“置顶公众号”技术文章第一时间送达!Full GC 到底是如何产生的?如何解决?前言Ful...

Coder编程的博客 2096

如果JVM出现频繁FullGC该如何解决

dump下来的文件大约1.8g,用jvisualvm查看,发现用char[]类型的数据占用了41% 内存,同时另外一个com.alibaba.druid.stat.JdbcSqlStat 类型的数据占用了35%的内 存,也就是说整个堆中几乎全是这两类数据。2. 应用发生了内存泄漏,导致应该被清理的对象没有清理,无限增长 通过分析heapdump,我们基本可以区分出两种情况,第一种情况,对象的分布都正 确,没有那种以下占用30%*-,甚至50%的对象。第二种情况就是某一种类型的对象, 占据了大量的内存空间。

qq_68824640的博客 1788

JVM优化-如何减少FullGC

面试,实战利器。 优化的重点就是尽量不要让对象进入老年代。如果对象进不去老年代,想Full GC都难。这是JVM调优的重点。(当然了引起fullgc的还有元空间满了 or 堆外空间满了)

屎壳郎先生 6671

徐无忌深入JVM虚拟机笔记:对于堆内存,虚拟机如何进行分代管理?

徐无忌深入JVM虚拟机笔记:对于堆内存,虚拟机如何进行分代管理? 完成:第一遍 1.堆内存怎么划分新生代和老年代? JVM根据对象在内存中存活时间的长短 把堆内存分为新生代和老年代 新生代和老年代的比例是:一比二 2.新生代由哪三部分组成? 新生代由三部分组成: Eden区(8/10)(伊甸园即刚生成的时候)+ (S0(1/10)+S1(1/10))Survivor区 Eden去和S0和S1的比例是 8: 1:1 3.新生代中在创建对象时分配空间? 大部分情况下,对象优先分配在Eden区,如果对象实在太大,

ADbyCool的博客 414

JVM什么时候会触发FullGC

Full GC(完全垃圾回收)是JVM中一次比较耗时的垃圾回收操作,它会回收整个堆内存(包括新生代和老年代)。

weixin_45990682的博客 1518
上一篇: 一文学会使用GCeasy——一款超好用的在线分析GC日志的网站
下一篇: 深入学习InnoDB可重复读隔离级别下如何避免幻读
CoderBruis
博客等级 码龄10年 4444粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值