记录一次生产环境下的jvm内存泄露问题和分析解决过程

本文详细记录了一次线上Java应用因内存泄漏导致大量HTTP请求超时的问题排查与解决过程,从发现异常到初步查找问题,再到深入分析及最终解决,为开发者提供了宝贵的实战经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现异常

  • 首先通过我们内部搭建的日志平台发现我们线上环境一个java应用有大量的http接口请求超时,登录linux服务器查看网络环境没有问题,判断是应用自身运行异常,重启应用后发现异常还在,开始查找问题。

初步查找问题

  • 通过指令: jstat -gcutil 查看jvm内存占用和gc情况:
  • 发现老年代内存占用比例过高,并且每次fullGC后并没有有效回收。老年代内存占用百分比变化趋势大致如下:
  • 初步判断大量请求超时和服务瘫痪的直接原因:
    • 每次fullGC后的内存占用越来越高
    • 内存占用增长速度越来越快
    • fullGC的频率越来越高
    • 最终占用达到100%,服务完全瘫痪

分析处理

  • 使用指令:jmap -histo:live *** | more 查看堆内存中的对象数量和大小
    • 发现Log4jLogEvent这个对象实例很多,占用内存也异常的大,初步分析是异步日志传输速度跟不上,导致日志对象堆积在内存中。
  • 尝试使用调整Flume传输日志参数:提高flume单次传输量,减少最大延迟时间
  • 重启应用并监控接口调用情况发现应用暂时恢复正常了。

 

后续分析

  • 在前一步分析内存的同时,使用指令:jmap -dump:format=b,file=heapDump.hprof将实时内存信息导出(dump过程比较慢,所以在问题暂时处理完后进行后续分析),使用mat分析内存结构:
    • 可以看到主要占据堆内存的对象信息,果然是Flume异步传输日志堵塞的问题。

总结

  • 对jvm内存泄露这类问题的解决,主要是要善于利用jvm提供的类似jstat、jmap等工具来分析查找问题。这次问题虽然解决,但是后续还是存在出现此类问题的风险。所以除了加强jvm问题排查能力的同时,我们也将建立应用监控平台的计划提上日程,希望能对jvm内存、线程等应用实时运行指标进行监控,便于尽早发现问题。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值