老年代内存不足报警

news/2024/11/28 21:54:14/

背景知识 (background)

老年代的对象大多是经过多轮Young GC后晋升上来的,即对象在堆里存活的时间比较长。

老年代内存不足通常意味着内存泄露,伴随着频繁的FullGC,可能会有较大停顿,甚至停顿十几秒,导致健康检查失败或接口超时。

目前老年代内存占用超过80%且持续2分钟,则会触发报警。

查看指标 (dashboard)

在这里插入图片描述

其中,Old Gen(heap)即老年代内存占用 ,min 即所选时段最小值,max 为所选时段最大占用,current为当前内存。

另外,开发也应关注监控面板:GC耗时 和 GC原因与频次。

止损措施 (action)

若想保存案发现场,可临时摘流后dump内存。

若想快速恢复,去私有云/容器平台手动重启报警节点,一般重启会平滑摘流、优雅停机。

事后改进(postmortem)

老年代内存不足,大多是内存泄露,建议摘流后Dump堆内存,联系OP下载到本地MAT内存分析,及时修复。

我们整理了一些常见的原因(cause),仅供参考。

可能的原因 (cause)

内存泄露的原因很多,大多是对象的生命周期太久了。

一、对象被长生命周期的组件引用

常见的全局静态变量、单例对象等强引用临时变量。

比如,Map每次调用Put添加对象,但缺乏淘汰机制;本地缓存没有限制最大缓存数量;ThreadLocal没有正确的清理数据;一次性加载过多数据到内存里;

在性能统计等场景使用Map时,一定要确保在任意编码习惯下的 Key / Value内存开销是可控的,比如,Druid 数据源的SQL统计,我们之前遇到过有的项目SQL语句几百KB,导致SQL统计占用过多内存。

有的项目使用OpenFeign + PathVariable/RequestParam 请求Restful接口,但指标生成时,取了动态生成的uri导致指标数量膨胀。

有的项目使用MyBatis的foreach,传递了过多的参数,导致MyBatis生成的临时大对象存在过久,不能被及时回收。

有的组件使用JVM Runtime#addShutdownHook注册钩子销毁资源,那这个对象会一直被JVM Hook引用,若创建了很多实例,则都不会被回收。

二、内存分配速率过大

可参考监控面板:GC内存分配,了解每秒钟新生代分配了多少内存、多少内存晋升到了老年代。

内存分配过大,可能是一次性加载的数据过多,通常伴随着慢请求、慢查询、不合理的报表导入导出或文件上传下载机制。

对G1来说,大对象(Humongous)会直接在老年代分配,其他GC算法也有类似机制,超过一定阈值直接晋升到老年代。

如果业务逻辑执行过久,则会导致对象不能被及时回收。

建议通过应用大盘的常用排行榜 ( HTTP慢接口/慢SQL排行 ) 或查看当时的Accesslog、应用日志来筛选可能的请求,尽可能优化代码实现,降低单次执行的资源消耗

另外,可尝试 hawk的HeartBeat 、arthas 查看当时的线程堆栈,找到可能的慢请求。


http://www.ppmy.cn/news/259511.html

相关文章

程序员电脑最少得16G才够用啊!

现象 卡得要死,IDE PHPSTORM开两个完全就是800MB了,再运行个QQ、mysql、mongodb、redis,没谁了,完全动不了了。。公司配置的电脑内存太低了,才8G,而且硬盘很低,起码得16G内存才够用。如果是本子…

平板电脑4g运行内存够用吗_如何通过Windows平板电脑与其他设备共享3G / 4G Internet连接...

平板电脑4g运行内存够用吗 I’m sure that we are not the only people who carry around multiple devices and only have 1 or 2 mobile data plans. If the device carrying your data plan happens to be your Windows tablet, start celebrating. We’ll show you how you…

4g运行内存手机还能用多久_运行内存4g够用吗_2017年4g运行内存的手机够用么

展开全部 目前还是可以的。目前比较火和使用的是4g和6g这两种,这两种在游戏和各方面的运用上是没有多大的 展开全部 内存4G一般是够用的。如果安装的是32位系统,那么4G只会有3.25G被使用,其余的那些浪费了。如果 想买一台电脑,有4…

三分钟,教你3种前端埋点方式!

目录 前言 埋点方式 基于ajax的埋点上报 介绍 代码实现 缺点 基于img的埋点上报 script及link的缺陷 基于img做埋点上报 基于Navigator.sendBeacon的埋点上报 介绍 作用 补充 例子 优势 总结 常见埋点行为 点击触发埋点 页面停留时间上报埋点 错误监听埋点…

c++20 协程(coroutine)

c20 协程(coroutine) 在c20中,千呼万唤的协程终于来了,本文将对c20的协程进行讲解,了解其使用方法。 简介 c20的协程是无栈协程,通俗讲其是一种可以支持暂停和恢复运行的函数。 为此c20新引入了3个关键字, co_awai…

网络安全面试题大全(整理版)300+面试题附答案详解,最全面详细

前言 随着国家政策的扶持,网络安全行业也越来越为大众所熟知,想要进入到网络安全行业的人也越来越多。 为了拿到心仪的Offer之外,除了学好网络安全知识以外,还要应对好企业的面试。 作为一个安全老鸟,工作这么多年&…

2023年软件测试工程师如何提升?测试工程师破局进阶...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 熟练掌握基本的测…

银行项目:如何大规模、高效率的做自动化测试

背景 近几年,各家商业银行均在大力发展自动化测试。在这一进程中,自动化测试的设计理念不断完善,新的技术不断应用,使得自动化测试资产的积累代价和维护代价不断降低,自动化测试资产的数量不断增长。 在短短几年间&…