线上fullgc的case

简介: fullgc

问题出现

5月31日5-2发布后,钉钉业务报警群里收到监控报警,ngprod环境出现fullgc报警,如下

image.png

image.png


分析


通过查询线上log发现,是由于DingTalkProcessDefinition.toString引起的。

image.png


DingTalkProcessDefinition.toString代码如下,是通过工具类把对象的属性值打印出来。本次迭代在DingTalkProcessDefinition新增了一个属性List nodes,ProcessNode数据结构如下图,并且ProcessNode的toString方法和DingTalkProcessDefinition的toString方法是一样的,这样就导致在

DingTalkProcessDefinition.toString的时候,由于ProcessNode的存在,导致占用的内存指数级的爆炸增长。

注:web-pro里存在LogAspect这个aop,会打印方法的入参出参和执行耗时,入参的打印会调用参数的toString,如果太长,会截取。这个问题就是在打印方法耗时时调用了DingTalkProcessDefinition和ProcessNode的toString方法。

image.png

image.png


解决方案

首先我重写了DingTalkProcessDefinition和ProcessNode的toString方法,只打印其中主要的属性值,至此其实fullgc问题已经解决,第二天和B讨论了这个需求的实现方式,修改了实现方案,

DingTalkProcessDefinition不需要使用ProcessNode这个对象。

image.png



总结

在使用树形或者更复杂的数据结构时,需要注意可能造成的性能问题,尤其是注意对应的toString方法。

相关文章
|
1月前
|
算法
除了break和continue,还有其他方式控制ES7中for...of循环吗?
除了break和continue,还有其他方式控制ES7中for...of循环吗?
WXM
|
5月前
|
存储 缓存 运维
一场FullGC故障排查
本文档详细记录了一次线上Java应用因频繁Full GC导致CPU使用率异常升高的问题排查与解决过程。
WXM
217 3
|
4月前
|
监控 JavaScript Java
JVM源码级别分析G1发生FullGC元凶的是什么
线上系统遭遇频繁Old GC问题,监控显示出现多次“to-space exhausted”日志,这表明垃圾回收过程中因年轻代 Survivor 区或老年代空间不足导致对象晋升失败。通过 JVM 源码分析,此问题源于对象转移至老年代失败时,JVM 无法找到足够的空间存放存活对象。进一步排查发现大对象分配占用了预留空间,加剧了空间不足的情况。使用 JFR 分析工具定位到定期报表序列化导致大量大对象生成,通过改用堆外内存进行序列化输出,最终解决了频繁 Old GC 问题。
142 0
|
4月前
|
存储 缓存 运维
有关一次FullGC的故障排查
在收到容器CPU使用率达到104%的告警后,通过日志发现多个线程正在进行批处理任务。初步怀疑Full GC导致CPU占用过高,但内存使用率仅为62%,不符合预期。进一步排查发现监控指标与实际情况不符,最终确认是由于JVM Full GC引起的CPU激增。通过分析堆内存快照,定位到四个大型`List<Map<String, String>>`对象占用了近900MB内存,这些对象由用户上传的Excel转换而来,导致内存膨胀。这些大对象在JVM中长时间驻留,容易触发Full GC。 为解决此问题,提出了两种方案: 1. 将数据存储于缓存而非JVM内存中; 2. 减少内存中对象的数据量,如删除无用字
|
6月前
|
Arthas 监控 Java
线上频繁fullgc问题-SpringActuator的坑
偷偷开启的监控在吃内存
133 0
|
前端开发
如何解决出现Unknown at rule @applyscss(unknownAtRules)警告?
如何解决出现Unknown at rule @applyscss(unknownAtRules)警告?
1227 0
|
运维 监控 数据库连接
|
算法 Java
一文搞懂Y-GC和Full GC的触发条件
1 Young GC触发时机 一般在新生代Eden区满后触发,采用复制算法回收新生代垃圾。
1039 0
|
Java
如何优化生产环境的Full GC?
大部分工程师开发完一个系统后,部署生产环境的时候往往不对JVM进行参数设置,直接用默认JVM参数,这绝对是系统负载逐渐增高的时最大问题 如你不设置-Xmx、-Xms之类的堆内存大小,你启动一个系统,可能默认就给你几百MB的堆内存大小,新生代和老年代可能都是几百M。
172 0
|
监控 Java 索引
增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
下一篇
DataWorks