记录线上排查内存泄露问题

这篇具有很好参考价值的文章主要介绍了记录线上排查内存泄露问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

记录一次云上排查内存泄露的问题,最近监控告警云上有空指针异常报出,于是找到运维查日志定位到具体是哪一行代码抛出的空指针异常,

问题分析

发现是在解析cookie的一个方法内,调用HttpServletRequest.getServerName()获取不到抛出的NPE,这个获取服务名获取不到,平时都没有出现过的问题,又没有发版,那初步怀疑应该前端或者传输过程有问题导致获取不到参数,

后续找了运维查了ng的日志,确实存在状态码为499的错误码,查了一下这个是客户端端主动关闭请求或者客户端网络断掉时报的错误码,那也就是前端断开了请求,继续排查为啥前端会中断请求的原因,问了前端同学说是超时时间设置了10秒,又看了日志,确实是有处理时间超过10秒的,那问题大概定位到了。接下来就是分析处理时长为什么会那么长,看了报错的时候请求量并没有很大,2.0云上本身就还没有放量,后续让运维查了机器有几台cpu用量处于30%左右,明显高于另外几台3%,而且499错误的集中在cpu用量高的几台,怀疑是否是内存问题导致,让运维跑了jstat -gcutil 看了一下,确实存在full GC问题,又跑了jmap -dump下了dump文件,定位到是ip限流的方法,有一个清除Map的方法在多线程并发情况下没有生效,导致内存泄露,知道问题后反推感觉就一切的疑问有了结果,ng报499是前置超时,超时是服务频繁full gc导致stw,无法处理请求导致耗时增加,ng探活接口在机器stw期间无法响应产生了error.log,而有几台机器cpu不高是因为之前重启过所以释放掉了内存没有触发full gc。

后续处理是改进了ip限流的方法,测试环境复现问题和改动限流方法,

(jstat命令使用参考:https://www.cnblogs.com/i-code/p/14157048.html)

1、FullGc触发的很频繁,时间或是次数并不是远小于Younggc的,但是每次回收都较为有效,回收后能有效清理内存释放空间。此时考虑内存分配不足,应调整Jvm启动参数(Xmx
Xms),以避免频繁gc影响性能甚至因内存不够造成 OOM。

2、FullGc后期触发越发频繁,每次回收后老年代内存释放的很少,这种情况是内存泄漏或业务设计不合理导致,泄露的内存不能被有效回收,导致可用空间越来越小最后直至不可用,此种问题需要针对性的解决。

总结

通过guaua的LoadingCache监听器的方式过期自动处理,这次问题嵌套问题比较多,由于上报量低,ng侧报了499没有纳入监控范围,而且机器由于重启没有快速发现问题,后续改进是代码侧能复用规范代码最好复用,不要重复造轮子,和测试沟通阶段应该覆盖对应的场景测试,开发需要详尽跟测试反馈改动点和测试案例评审,定位问题应该从实际出发,出现问题得及时从现有信息的结果反馈去判断问题所在,及时处理和团队沟通。

记录线上排查内存泄露问题文章来源地址https://www.toymoban.com/news/detail-435611.html

到了这里,关于记录线上排查内存泄露问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++内存泄露排查的一个案例

    背景: 这熟悉的线条. 请求量没啥波动, 不用怀疑, 就是内存泄露了. 方案一 Valgrind Valgrind可以用来检测是否有非法使用内存的问题, 如: 访问未初始化的内存,访问数组越界, 忘记释放动态内存的问题; 首先需要定位是哪个进程的内存泄露. 使用top命令, 然后shift+m按照内存排序, 找

    2024年02月13日
    浏览(35)
  • Java 使用 VisualVM 排查内存泄露

    线上突发告警,笔者负责的一个服务 老年代内存使用率到达 75% 阈值 ,于是立即登录监控系统查看数据。拉长时间周期,查看最近 7 天的 GC 和老年代内存占用,监控截图如下。 可以看到老年代占用内存的最低点在逐步抬升,初步判断是发生了内存泄露 2.1 初步排查 从监控上

    2024年02月15日
    浏览(50)
  • 【JVM】Java内存泄露的排查思路?

    Java内存泄露(Memory Leak)是指在Java程序中,无用的对象占用了 堆内存 ,但无法被垃圾回收器回收释放,从而导致可用内存逐渐减少,最终可能导致内存耗尽或性能下降的问题。 说明一般对于内存泄漏。都是针对 堆 的。 程序一般出现内存泄漏会有 两个状态 一是一启动导致

    2024年02月13日
    浏览(46)
  • 线上排查定位OOM问题的记录

    整体思路:把机器上的快照文件下载到本地电脑,用eclipse analyzer打开它,找到是哪一行导致oom。 注:日志里看不到报错信息是因为 还没有来得及记录到日志文件,就down了。 把该文件下载到本地电脑,可以借助xftp等工具下载。 如果想在IDEA里模拟oom,这么设置jvm参数: -Xm

    2024年02月10日
    浏览(29)
  • Linux C/C++ 程序内存泄露排查

    由于C/C++程序可以动态申请内存,动态申请的内存位于程序的队区,如果程序比较复杂,程序员在编写代码的时候不小心,可能会存在申请了内存没有释放的情况,程序长期运行,会导致系统中用户程序可分配堆内存越来越少的,最终程序OOM崩溃。 /proc/meminfo 文件保存了系统

    2024年02月03日
    浏览(35)
  • C++经典面试题:内存泄露是什么?如何排查?

    1.内存泄露的定义:内存泄漏简单的说就是申请了⼀块内存空间,使⽤完毕后没有释放掉。 它的⼀般表现⽅式是程序运⾏时间越⻓,占⽤内存越多,最终⽤尽全部内存,整个系统崩溃。由程序申请的⼀块内存,且没有任何⼀个指针指向它,那么这块内存就泄漏了。 2.如何检测

    2024年02月07日
    浏览(45)
  • 线上FullGC问题排查实践——手把手教你排查线上问题

    作者:京东科技 韩国凯 问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104% 观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用户后重启应用后解决问题

    2024年02月02日
    浏览(47)
  • 线上问题排查回答(转载)

    面试官:「你是怎么定位线上问题的?」 这个面试题我在两年社招的时候遇到过,前几天面试也遇到了。我觉得我每一次都答得中规中矩,今天来梳理复盘下,下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路去答: 1、如果线上出现了问题,我们更多的

    2023年04月27日
    浏览(51)
  • 【面试】线上 CPU 100% 问题排查

    回答套路一般为:线上服务器没有排查过,线上服务器只有运维才有操作权限。在平时开发的时候,在测试服务器上排查过。 2.1、将代码打包成 jar 包 参考: 点我 2.2、传到服务并运行 运行好的效果如下 3.1、拿到进程 id 通过 top 命令,就可以看到让 cpu 100% 的进程 id,pid 就是

    2024年02月11日
    浏览(50)
  • 【记一次线上事故的排查思路】- CPU飙升问题排查

    由于项目排期较紧,临时从其他组调来三个开发资源帮我一起做项目,难免上线的时候大家的需求一块上线。 问题来了,上线三天后,线上CPU总是莫名奇妙的突然飙升,飙升后CPU并未降下来,而是一直处在高点。 由于是线上导致的问题,CPU超限后,会自动重启项目,未能保

    2024年01月23日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包