美文网首页
记一次Java内存泄露导致的系统宕机

记一次Java内存泄露导致的系统宕机

作者: Andy的书斋 | 来源:发表于2018-04-02 20:50 被阅读0次

近期刚接手一个服务化应用,但每隔几天都会出现JVM进程僵死的情况。查看日志发现有大量的RocketMq Broker连接超时,起初怀疑是RocketMq broker不可用导致,但中间件同学反馈broker无异常。


应用异常日志

苦思无果后,使用jstack抓取JVM的线程堆栈,发现大量线程阻塞在获取RootLogger的锁


image.png

而该锁又被另一个消费者线程持有,但该线程处于RUNNABLE状态,由此判断不是死锁问题。该线程当前持有的锁仅仅是写入本地日志,怀疑是日志写入存在瓶颈。然而查看磁盘的利用率和对应的日志文件的增长速度,又否定了该判断。


image.png

随后使用jstat -gc指令分析JVM内存回收情况,发现老年代内存已经耗尽,FULL GC非常频繁,初步断定是JVM内存溢出。


image.png

使用jmap -histo指令发现业务对象OpenLogTO有350W未释放

image.png
排查业务代码发现,该对象通过开源框架EventBus写入ConcurrentLinkedQueue,并由另外一个线程从队列中获取并消费,而消费者此时已经由于异常而退出,导致OpenLogTO持续通过EventBus写入队列而不会被消费。
排查线上的疑难杂症,除了需要剖根问底的精神,严谨的思考能力,还需要对JVM的调优工具比较熟悉。分享一篇JVM性能调优工具使用 帮助大家了解JVM的常用调优工具。
image.png

相关文章

  • 记一次Java内存泄露导致的系统宕机

    近期刚接手一个服务化应用,但每隔几天都会出现JVM进程僵死的情况。查看日志发现有大量的RocketMq Broke...

  • Android基础知识(一)

    1、内存溢出和内存泄露有什么区别 内存溢出:应用的内存已经已经达到系统设置的最大值,进而导致崩溃 内存泄露:应用使...

  • 内存泄漏/管理

    ARC 下内存泄露的那些点performSelector延时调用导致的内存泄露iOS ARC下几种导致内存泄露的场...

  • 内存优化

    内存泄露的原因 四种引用类型 常见的内存泄露 1.内部类导致内存泄露 Handler 2.Context导致内存泄...

  • 【Tips】 拒绝循环引用

    前言 最近项目中检查是否有内存泄露,发现大部分的情况都是由于block的循环引用而导致的内存泄露,所以借此机会来记...

  • android 内存性能

    handle引起的内存泄漏 强引用资源引起的内存泄漏 线程导致的内存泄漏 系统学习安卓内存泄露 large hea...

  • Java弱引用学习 WeakHashMap、ReferenceQ

    上一篇文章 Java内存泄露学习 ThreadLocal真的会内存泄露吗 提到ThreadLocal内存泄露的问题...

  • JAVA系统堆外内存泄露

    JAVA系统堆外内存泄露 问题描述 最近有个系统在做压力测试,环境配置:CentOS系统 4核CPU 8g内存 j...

  • 内存泄漏分析(一)

    内存泄漏(memory leak),指程序在申请内存后,一直无法释放已申请的内存空间。内存泄露会消耗内存导致系统卡...

  • Android常见内存泄漏汇总

    目录:一、内存泄漏介绍二、常见内存泄漏场景1.单例导致内存泄露2.静态变量导致内存泄漏3.非静态内部类导致内存泄露...

网友评论

      本文标题:记一次Java内存泄露导致的系统宕机

      本文链接:https://www.haomeiwen.com/subject/hjwxhftx.html