优秀的编程知识分享平台

网站首页 > 技术文章 正文

记一次线上内存异常排查实战(线上内存泄漏如何定位)

nanyue 2024-10-12 05:46:53 技术文章 34 ℃

用户突然反馈系统使用慢,发现一个节点出现 OutOfMemoryError,导致线上环境突然CPU100%

思路:分析dump文件,找出泄漏点,对代码进行修复

dump文件获取

1.自动获取

打开/tomcat_home/bin/catalina.sh文件

最上面加上:JAVA_OPTS="$JAVA_OPTS -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/heapdump"

2.命令获取

jmap -dump:format=b,file=27036 .dump 27036 

27036 是java进程名称

dump文件分析

1.准备工具

下载插件: MemoryAnalyzer-1.9.2.20200115-win32.win32.x86_64.zip

下载地址:https://www.eclipse.org/mat/downloads.php

下载后解压:

双击 MemoryAnalyzer.exe 打开面板

File->Open Heap Dump 打开dump 文件

点击 Leak Suspects 进入疑似泄露点视

疑似问题1 (Problem Suspect 1)该TDSPacket对象类型占用了300多M,占用了总内存22.36%,这么大的内存占用率,很有可能导致内存异常

点击 Details 进入第一个疑似点

单击该行,单击 Java Basics,单击 Thread Details

进入到线程栈信息,红框中的是项目的业务类,到这一步根据根据方法的功能,基本就能推断出内存泄漏的原因了。

本例是一个导出execl 的功能,没有限制导出内容大小,导致内存溢出

最近发表
标签列表