记一次内存溢出查找的问题

情景:今天测试环境发现应用出现内存溢出的问题。这是从来没有出现过的问题,在关闭此次版本新上线的功能后仍发现Perm区的内存持续在增长。

jdk版本:1.7

环境:linux

======================================================

起因:测试环境出现内存溢出

排查过程:

1,重现此内存溢出问题

查看应用日志,定位到哪一个操作导致内存溢出。发现是在调用接口之后出现。但由于测试环境有测试人员不断在部署版本,所以重启应用,再调用接口,发现无异常,于是使用JMeter多次请求接口,重现异常。

2,关闭此次版本功能

此次版本新上线的功能逐一关闭开关,定位是否是由新功能引起,发现关闭所有新功能开关后问题仍然存在

3,期间使用jdk自带工具分析应用状况与gc日志

<a>ps -ef | grep java      查看应用

<b>jstat -gcutil pid 1000    持续观察应用情况

<c>jmap -dump        把内存情况拷贝下来

<d>无gc日志

发现应用的启动脚本设置的启动参数有问题,于是重新设置启动参数与gc日志

重设的启动参数包括-Xmx,-Xms,-XX:PermSize,-XX:MaxPermSize和增加GC日志,垃圾回收器等

4,重设参数后,启动应用

继续使用jdk工具命令观察,发现Perm区一直在增长,FGC后也是一直增长,但是没有内存溢出

5,此期间怀疑有类在不断加载,或者缓存在不断增大

6,排查代码,发现不是缓存原因,很大可能是类在不断增加,但是这个就很奇异了

7,在开发环境重新部署应用,发现与测试环境的现象相同,于是又在开发环境重新部署上一个版本的应用,彻底排除是新增功能引起的问题,使用jdk自带工具观察,发现Perm区仍有增长

除了之前的工具,还使用jconsole连接应用,观察应用的情况

8,再次排查代码,并且使用两种方法测试

<a>,for循环10W次请求开发环境应用,观察应用的Perm区

<b>,测试应用,手动点击发送请求,请求开发环境应用

<c>,排查应用代码

=================================

结果:

在上一个版本中仍存在Perm区不断增长的问题,其实原因是代码中一直有classloader在作怪,无法释放类,并且在不断加载,只是从未被发现,此次是由于启动脚本缺失某些参数才暴露出的问题。所以需要去除相对应的代码

临时解决方案:

由于版本问题,无法修改代码,而Perm区的增长,到一定值之后,增长速度会非常缓慢,所以暂时决定先调整启动脚本,增大Perm区的大小,支撑到下一个版本修改代码

原文地址:https://www.cnblogs.com/huangtao1927/p/jvm.html

时间: 2024-10-07 04:34:13

记一次内存溢出查找的问题的相关文章

记一次内存溢出的分析经历

背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的通信框架使用的是thrift. thrift很多优点就不多说了,它是facebook的开源的rpc框架,主要是它能够跨语言,序列化速度快,但是他有个不讨喜的地方就是它必须用自己IDL来定义接口 thrift版本:0.9.2. 问题定位与分析 步骤一.初步分析 客户端无法连接服务端,查看服务器的端口开

记一次内存溢出的分析经历——thrift带给我的痛orz

说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是我还是要来说说我的故事.................. 背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的通信框架使用的是thrift. thri

用http请求thrift服务端出现了内存溢出的情况

记一次内存溢出的分析经历 - Janti - 博客园 https://www.cnblogs.com/superfj/p/8474288.html 说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是我还是要来说说我的故事.................. 背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务

记一次java内存溢出的解决过程

注:本文主要记录这次解决内存溢出问题的过程而不是具体问题. 最近在写一个搜索引擎,使用倒排索引结构进行文档检索,保存索引的基本思想是先将倒排列表保存到内存中一个有序Map里(TreeMap),然后当内存占用达到一定阈值的时候将内存中的倒排列表有序写入磁盘,当磁盘已经存在索引时,则将内存中的索引和磁盘中的索引进行合并,生成新的索引,合并过程类似于归并排序.合并内存索引和磁盘索引的代码如下: public synchronized void merge(){ LogUtil.info("Invert

记一次java程序内存溢出问题

一个自然语言处理程序,在封装为web-service后,部署到线上运行. 但最近出现了内存溢出的情况,频繁的out of memory. 先盲目尝试在启动脚本中增加-XX:-UseGCOverheadLimit. 因为根据原因未找到,依然频繁的out of memory,只能一直观察jstat -gcutil <pid>,看到老生代内存降不下来时,重启程序. 服务程序很简单,简单接收参数,自然语言处理,返回数据,除了自然语言处理模块,都是方法参数,不会出现内存泄漏的情况. 第一次解决这种内存溢

记程序员生涯中第一次遇到内存溢出错误

情景: 在我使用Hibernate使用2个表[客户表,订单表]进行联表查询时,发生的StackOverflowError. 问题: 我两个实体类中都重写了toString()方法,并且相互调用了彼此,导致我println(客户)时,一直会相互调用彼此的toString()方法,导致栈溢出错误. 解决: 去掉订单类toString()方法中的客户类. 分析: 在<深入理解Java虚拟机>一书中,是这么介绍的(Page 26) Java虚拟机栈---在Java虚拟机规范中,对这个区域规定了两种异常

记因PHP的内存溢出导致的事故之解决

如果对您有用记得关注,更多干货. 今天上午刚到公司,就有同事在公司群里反映某个计划任务出现问题了.我就怀着刨根问底的心,去查看了log.发现挺有意思的一个问题,PHP内存溢出导致脚本执行失败.那就一起来看个究竟吧! 首先查看了计划任务的Log 从报错信息字面意思可以看出,允许的134217728 bytes的内存已经用尽,还要试图分配12961640 bytes内存. 给你(当前脚本)分配的内存你已经用完了,你还想问系统要内存.系统这时想对你说: 地主家也没有余粮啊(借用葛优大爷的一句话) 模拟

JVM - 内存溢出,问题查找

当内存溢出会抛出 java.lang.OutOfMemoryError: Java heap space 的异常,那这个时候怎样去分析到底哪里导致内存溢出呢? 我们可以通过在vm的参数, -XX:+HeapDumpOnOutOfMemoryError 记住这个理是大写XX. 当内存溢出后,显示 java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid1034.hprof ... Heap dump file crea

[Android] 对自定义图片浏览器经常内存溢出的一些优化

首先关于异步加载图片可以参见 夏安明 的博客:http://blog.csdn.net/xiaanming/article/details/9825113 这篇文章最近有了新的更改,大概看了一下,内容更完善了.而我参考他之前的代码,发现了很多与内存有关的问题,这里记录一下发现的问题和解决方法. 本文地址:http://www.cnblogs.com/rossoneri/p/4284478.html 首先上个功能图: 1.本地图片浏览器做成对话框的形式,可以显示文件夹 2. 图片支持多选 3. 图