记一次线上JAVA内存溢出分析及报告

线上内存溢出分析报告

java程序本身有自己的GC垃圾回收机制,一般我们在开发的时候,不需要关注垃圾回收等问题。但往往在实际开发过程中,有些代码运行一直占用内存不释放,从而导致我们的程序会出现内存溢出等情况。下面就实际线上遇到内存溢出做一次简单的分析报告:

1.线上问题

1.1 线上运行top

	当我们线上运行这个top命令,发现此事Java占用CPU高达1200+%,一直不降,此事意识到我们的程序出问题了。打开我们的日志,发现如下:

记一次线上JAVA内存溢出分析及报告_第1张图片
从上面的日志,我们不难发现,内存溢出啦~

2.解决方案

2.1 程序添加堆栈记录

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/heapdump.hprof

java -Xms1024m -Xmx1024m -Dfile.encoding=utf-8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/heapdump.hprof  -jar 你jar的绝对路径/xx.jar server metaplexor.yml  > /dev/null

重启启动服务,等待下一次的内存溢出,这样溢出信息会自己记录到你定义的路径下,例如我的会记录在/home/heapdump.hprof下。等出现内存溢出了,我们将日志拉取到我们本地上,运行内存分析工具进行分析

2.2 内存分析

将内存分析工具 mat.zip 解压安装。
工具下载

2.2.1 运行我们的工具:双击程序打开

记一次线上JAVA内存溢出分析及报告_第2张图片

2.2.2 打开程序,打开我们拉取的heapdump.hprof文件

记一次线上JAVA内存溢出分析及报告_第3张图片
找到下载下来的*.hprof文件,等待解析,加载完成。点击完成
记一次线上JAVA内存溢出分析及报告_第4张图片
接下来我们就能看见我们程序内存占用比例了,问题代码占用了690.2M资源没释放
记一次线上JAVA内存溢出分析及报告_第5张图片
点击详情,具体看下,可知org.quartz.simpl.SimpleThreadPool$WorkerThread @ 0xc09dd590 DefaultQuartzScheduler_Worker-12,这块出问题,选择它,点击左键,查看具体堆栈信息
记一次线上JAVA内存溢出分析及报告_第6张图片
记一次线上JAVA内存溢出分析及报告_第7张图片
点击左键,具体分析代码
记一次线上JAVA内存溢出分析及报告_第8张图片
记一次线上JAVA内存溢出分析及报告_第9张图片
通过堆栈信息可知,问题出现在这里,找到具体代码查看分析可知,由于这个查询结果数据量高达340万,大概算一下字节数,已经超过我们预设的2G内存空间,且这块是定时任务在运行,每次都占用那么空间,资源来不及释放。最终优化这块,每次查询200条结果。重新部署线上,运行,没有发现问题。

你可能感兴趣的:(JAVA相关)