Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >记一次内存泄漏排查过程

记一次内存泄漏排查过程

作者头像
spilledyear
发布于 2020-04-30 10:42:07
发布于 2020-04-30 10:42:07
51500
代码可运行
举报
文章被收录于专栏:小白鼠小白鼠
运行总次数:0
代码可运行

新版的dubbo-admin 在支持dubbo2.7新特性的同时,还兼容dubbo2.6。基于dubbo2.7的元数据中心,我们可以做一些事情,比如服务测试,在目前版本的dubbo-admin中,其实已经支持这个功能。

结论

先说结论,导致内存泄漏的代码在 org.apache.dubbo.admin.service.RegistryServerSync#notify 中,核心代码就是这一段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (URL_IDS_MAPPER.containsKey(url.toFullString())) {
    ids.put(URL_IDS_MAPPER.get(url.toFullString()), url);
} else {
    String md5 = CoderUtil.MD5_16bit(url.toFullString());
    ids.put(md5, url);
    URL_IDS_MAPPER.putIfAbsent(url.toFullString(), md5);
}

简单来说就是 URL_IDS_MAPPER一直在增长,导致它占用的内存越来越越大,最后导致不停的fullGC

分析

  1. 什么情况下会执行这个方法? 当/dubbo下的节点发生变更的时候
  2. URL_IDS_MAPPER的本意只是想维护一个 md5 与 fullUrl 的关系,但因为控制不当,导致它的容量不断增长,感觉这个URL_IDS_MAPPER完全没有必要
  3. 控制不当指的是什么? 比如每次提供者或者消费者 上线 -> 下线 -> 上线,虽然该服务一直都只有一个实例,但却产生了多个MD5,如果频繁的进行这个操作,就会导致URL_IDS_MAPPER容量越来越大
  4. URL_IDS_MAPPER对应的其实还有一个 'registryCache',但为什么 'registryCache'没有内存泄漏问题? 因为在该方法中有针对'registryCache'的清除操作
  5. 怎么发现的这个问题? 如果服务量比较小,服务变更不频繁,可能感知不到这个问题。但如果服务量大又经常上下线,这个问题就很明显了。会发现应用占用的内存越来大,到后面服务器就一直在fullGC了
  6. 怎么排查? top -> 看GC -> 内存dump -> MAT分析 -> 查看大对象 -> 发现URL_IDS_MAPPER中元素有100万+ ->再分析代码
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货分享:一次Java内存泄漏排查实战
不知道是公司网络广了就这样还是网络运维组不给力,网络总有问题,不是这边交换机脱网了,就是那边路由器坏了,还偶发地各种超时,而我们灵敏的服务探测服务总能准确地抓住偶现的小问题,给美好的工作加点料。
IT大咖说
2019/06/14
5740
干货分享:一次Java内存泄漏排查实战
一次 Java 内存泄漏的排查
前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理、Bug 排查、运营 issue 处理的事。工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了。
枕边书
2019/05/25
6440
分享一次 Java 内存泄漏的排查
前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理、Bug 排查、运营 issue 处理的事。工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了。
芋道源码
2019/11/11
8430
内存泄漏排查
在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC(Garbage Collection垃圾回收),这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。
用户4283147
2022/10/27
4650
内存泄漏排查
小程序内存泄漏排查与解决
在小程序的开发中,内存管理是一个至关重要的话题。内存泄漏问题往往难以察觉,却会影响应用的性能和用户体验。内存泄漏指的是程序在运行过程中未能释放不再使用的内存,导致内存不断增长,最终可能导致程序崩溃或响应变慢。小程序作为一种轻量级的应用,其内存管理尤其重要,因为不当的内存使用会影响到整个系统的稳定性。
LucianaiB
2025/01/28
2230
记一次线上内存泄漏的破案过程
9月的某个上午,业务侧突然反馈线上数据服务响应慢,造成任务积压,正常情况下耗时5ms的服务,单次响应达到了5s量级. 收到反馈后我们马上开始排查服务状况,但发现各项指标很健康,接口平均耗时3ms,p99约为1s,和经验值比无太大差别. 业务侧随后补充反馈是某些请求很慢,感觉是若干pod有问题,当流量打到这几台机器时就会变慢.
用户9580384
2022/10/05
1.1K1
记一次线上内存泄漏的破案过程
记一次golang内存泄漏问题的排查
最近在用golang开发一个内容推荐的项目, 在打算进行压测前就发现容器每过一段时间就会重启,查看机器内存情况时发现自启动来内存一直在上升,然后到达一个容器最大可用内存阈值后重启。如下图:
Johns
2021/04/28
5.6K1
记一次内存泄漏排查
httpclient一只read time out,使用jmx 产看内存是每天都在上升的。
OPice
2019/11/19
4950
一次毕生难忘的 Java 内存泄漏排查经历
人人都会犯错,但一些错误是如此的荒谬,我想不通怎么会有人犯这种错误。更没想到的是,这种事竟发生在了我们身上。当然,这种东西只有事后才能发现真相。接下来,我将讲述一系列最近在我们一个应用上犯过的这种错误。最有意思的是,一开始的迹象揭示的问题,与实际发生的问题完全不同。
Bug开发工程师
2018/12/10
7990
一次毕生难忘的 Java 内存泄漏排查经历
JS内存泄漏排查方法
内存泄漏是一个累积的过程,只有页面生命周期略长的时候才算是个问题(所谓“刷新一下满血复活”)。频繁交互能够加快累积过程,偏展示的页面很难把这样的问题暴露出来。最后,JS逻辑相对复杂才有可能出现内存问题(“bug多是因为代码量大,我自己都hold不住”),如果只是简单的表单验证提交,还没什么机会影响内存
ayqy贾杰
2019/06/12
7.8K0
JS内存泄漏排查方法
一次完整的JVM堆外内存泄漏故障排查记录
记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些「JVM内存分配的原理分析」以及「常用的JVM问题排查手段和工具分享」,希望对大家有所帮助。
Rude3Knife的公众号
2020/08/28
3.9K0
一次完整的JVM堆外内存泄漏故障排查记录
小程序内存泄漏排查与解决
在小程序开发中,内存泄漏是一种常见的性能问题,若得不到及时处理,会导致应用性能下降,甚至崩溃。内存泄漏是指在程序运行时,占用的内存不能被释放,造成内存不断累积,最终影响应用的稳定性。特别是在小程序这种轻量级应用中,内存管理尤为重要,开发者需要时刻关注可能导致内存泄漏的地方,并采取合适的解决措施。
LucianaiB
2025/01/28
3190
记一次openssl使用不当引发的内存泄漏
前言:本文记录一起第三方库使用不当引发的内存泄漏的定位过程。在日常工作中新写服务或者代码引发的内存泄漏还是相对较好定位的,因为这种情况下改动范围相对明确。但有时候也会面临从未动过的服务发生内存泄漏,这意味着这个服务很早就引入了内存泄漏,引发内存泄漏的范围相当不聚焦,这个时候很多同学就不知道如何下手。本文主要展现:①展现面对内存泄漏问题的定位及思考过程 ②综合利用wiresharks、jmeter等工具进行效果验证。
鹅厂老五
2024/06/16
6441
生产事故复盘:详解一次由读写锁引起的内存泄漏
JVM相关的异常,一直是一线研发比较头疼的问题。因为对于业务代码,JVM的运行基本算是黑盒,当异常发生时,较难直观的看到和找到问题所在,这也是我们一直要研究其内部逻辑的原因。
Java识堂
2021/08/05
5060
生产事故复盘:详解一次由读写锁引起的内存泄漏
记一次内存泄漏的问题排查
收到告警后,笔者先登录到告警机器中, top命令查看此时此刻的各个应用程序占用的内存大小, 这里其实有两个指标可以查看,
2014v
2019/11/18
1.8K0
给dubbo贡献源码,做梦都在修bug
在之前的文章《redis在微服务领域的贡献》中,从一次面试经历中了解了redis可以在微服务中玩的这么溜,同时也从源码角度分析了dubbo的redis注册中心。最后得出了dubbo的redis注册中心不能用于生产的结论,其中原因有如下两点:
龟仙老人
2021/06/15
4890
浅谈Golang内存泄漏
内存泄漏并不是指物理上的内存消失,而是在写程序的过程中,由于程序的设计不合理导致对之前使用的内存失去控制,无法再利用这块内存区域;短期内的内存泄漏可能看不出什么影响,但是当时间长了之后,日积月累,浪费的内存越来越多,导致可用的内存空间减少,轻则影响程序性能,严重可导致正在运行的程序突然崩溃。
素履coder
2022/10/05
2.6K0
浅谈Golang内存泄漏
jvm内存溢出分析内存溢出是什么?内存溢出和内存泄漏有什么区别?用到的jvm参数分析解决方法分析
概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和内存泄漏有什么区别? 内存泄漏是由于使用不当,把一部分内存“丢掉了”,导致这部分内存不可用。 当在堆中创建了对象,后来没有使用这个对象了,又没有把整个对象的相关引用设为null。此时垃圾收集器会认为这个对象是需要的,就不会清理这部分内存。这就会导致这部分内存不可用。 所以内存泄漏会导致可用的内存减少,进而会
用户1174983
2018/02/05
1.7K0
jvm内存溢出分析内存溢出是什么?内存溢出和内存泄漏有什么区别?用到的jvm参数分析解决方法分析
IT 知识-内存泄漏和内存溢出
内存泄漏指我们向系统申请了内存,但是一直持有该内存空间,没有进行合理的释放,导致内存空间被浪费。
zinyan.com
2023/07/14
5280
IT 知识-内存泄漏和内存溢出
记一次疑似JVM内存泄漏的排查过程
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
京东技术
2024/06/19
3030
记一次疑似JVM内存泄漏的排查过程
相关推荐
干货分享:一次Java内存泄漏排查实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验