美文网首页
一次JVM内存溢出的处理过程

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

作者: 代老板的鱼塘 | 来源:发表于2019-10-15 14:41 被阅读0次

概要

笔者所管理的测试一台业务服务器,近期经常被反馈应用卡顿并且出现过多次内存溢出,本篇为对此问题的处理过程的记录。
服务器环境采用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中,可以看到很详细的信息,有两个对象占用了大量的内存。



通过查看线程信息发现为一个报表功能,该报表查询的数据量太大,而且sql效率比较低。


优化思路

  • 限制报表提取条件,尽量控制报表的大小在合理范围内
  • 超大的报表采用其他实现方式,例如通过定时任务将报表生成存放在指定文件服务器,由用户自行下载
  • 本例中的报表会由jdbc的ResultSet 转成最终的报表对象,中间会经历很多中间步骤,例如Vetcory、ArrayList等,尽量减少中间步骤
  • 优化sql,尽快释放对象,可以被GC进行回收

相关文章

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

    概要 笔者所管理的测试一台业务服务器,近期经常被反馈应用卡顿并且出现过多次内存溢出,本篇为对此问题的处理过程的记录...

  • java 基础 - 收藏集 - 掘金

    Java 学习过程|完整思维导图 - 后端 - 掘金JVM 1. 内存模型( 内存分为几部分? 堆溢出、栈溢出原因...

  • Java开发

    JVM 内存溢出实例 - 实战 JVM(二) 介绍 JVM 内存溢出产生情况分析Java - 注解详解 详细介绍 ...

  • JVM

    简介 Jvm 系列一:Java类的加载机制Jvm系列二:JVM内存结构 --内存泄漏与内存溢出Jvm系列三:GC算...

  • [JVM入门指南01]内存区域与溢出异常

    本文将介绍JVM的结构、对象的创建和分配过程、内存溢出。 JVM介绍 java文件执行流程: .java文件通过J...

  • JVM

    1. 内存溢出和内存泄漏 内存溢出是说程序需要申请的内存超过了JVM当前可以分配的最大内存,溢出。内存泄漏是说期望...

  • HashMap内存内存溢出问题

    内存溢出 内存溢出就是内存超出了JVM虚拟机的内存容量,导致出现了java.lang.OutOfMemoryErr...

  • 那个小白还没搞懂内存溢出,只能用案例说给他听了

    内存溢出,通俗的理解,就是你要求分配的内存超出了JVM能给你的,JVM不能满足需求,于是产生溢出。为了便于理解,本...

  • JVM异常处理

    JVM监控和管理主要针对的是JVM内存溢出问题和性能问题,本篇主要介绍JVM常见的异常处理方式和性能调优。 一、O...

  • 【Java JVM】Java 内存溢出 栈溢出的原因与排查方法

    1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果...

网友评论

      本文标题:一次JVM内存溢出的处理过程

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