记一次JVM内存溢出的处理过程

发布时间:2020-08-11 05:54:54 作者:u_7deeb657158f
来源:ITPUB博客 阅读:121

概要

笔者所管理的测试一台业务服务器,近期经常被反馈应用卡顿并且出现过多次内存溢出,本篇为对此问题的处理过程的记录。
服务器环境采用Oracle JDK1.6,虚拟机为HosSpot,Web容器为Tomcat7。

处理过程

获取堆内存转储快照

在用户反馈系统卡顿时,登陆服务器通过命令查看内存使用情况

jps #获取java的进程ID
jstat -gc 31795 #31795为jps查询到的进程ID

得到内存使用情况如下:

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
932032.0 932032.0  0.0    0.0   932096.0 932096.0 5592448.0  5592448.0  131072.0 60017.9     20   13.991  69    892.270  906.260

从结果可以得知,堆内存已经达到容量上限,并且在不断的进行FGC,所以应用系统表现的特别卡顿。
通过jmap命令生成堆转储快照:

jmap -dump:format=b,file=heap.hprof 31795

出现以下提示则表示生成成功:

Attaching to process ID 31795, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.45-b01
Dumping heap to heap.hprof ...
Heap dump file created

分析堆转储快照

使用MemoryAnalyzer打开堆转储快照,但提示heap space的堆内存溢出的异常:

An internal error occurred during: "Parsing heap dump from 'java_pid4259.hprof'".
Java heap space

修改配置MemoryAnalyzer.ini,调整堆内存大小

-Xms1024m
-Xmx8192m

在MAT的Leak Suspects中,可以看到很详细的信息,有两个对象占用了大量的内存。
记一次JVM内存溢出的处理过程
通过查看线程信息发现为一个报表功能,该报表查询的数据量太大,而且sql效率比较低。
记一次JVM内存溢出的处理过程

优化思路

推荐阅读:
  1. 记一次僵尸进程的处理
  2. 记一次文件失踪原因的定位过程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm 一次 内存

上一篇:当网红本人成为网红毒瘤:Vtuber的纸片人模式能够破解困局吗?

下一篇:[AlwaysOn2017] AlwaysOn的DMV和DMF - Sys.fn_hadr_distributed_ag_replica

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》