论坛首页 Java企业应用论坛

一天内JVM让服务器内存耗尽

浏览 8981 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-06-04  
公司的应用服务器部署了tomcat,在一天之内就会内存耗尽。抓取了dump文件,发现有一亿个MapEntry对象在堆中,耗尽了服务器内存。但是不能追踪到引用这些对象的地方。麻烦问一下,有哪位遇到过类似的问题?或者有什么思路?谢谢。


  • 大小: 144.3 KB
   发表时间:2015-06-06   最后修改:2015-06-06
打出javacore,搜索linkedHashMap,会发现相对应的堆栈,然后着重分析系统业务代码,你这情况 可能是OOM了,目测你们场景有点像查询SQL和 做缓存导致
0 请登录后投票
   发表时间:2015-06-08  
可以先用代码静态分析工具 扫扫
0 请登录后投票
   发表时间:2015-06-08  
你可以查看下程序中用LinkedHashMap的地方有多少,应该不多吧,这个使用的应该不多。主要看一下是使用完了未清理还是逻辑有问题,有限条件不停循环造成的。
0 请登录后投票
   发表时间:2015-06-08  
看看你的LinkedHashMap 是在什么场景被使用了,肯定是使用完了没有做处理造成的,如果做了cache的话,可能是缓存造成了, 另外你的tomcat的jvm是怎么设置的,难道你把jvm设置的极大?
0 请登录后投票
   发表时间:2015-06-09  
btrace 打下 MapEntry的 <init> 方法的调用栈。
或者最简单的,看看entry里的内容既可以猜测出是存放的什么东西。。。。
难道是session??
0 请登录后投票
   发表时间:2015-06-09  
我正好解决过内存泄露的问题:
1.根据Jprofiler的提示,静态检查代码中static的变量和session变量,是否会容纳LinkedHashMap。
2.根据上一步的猜测,建立压力测试,重现问题,如果能重现,那么修改后重测后问题消失,则解决;
如果上一步猜测没有命中,那么就需要模拟典型的用户操作来重现问题。不管怎么样,能用压力测试重现内存耗尽的问题是很重要的一步。然后再逐步缩小测试的范围,直到足够小能抓住问题。

我上次解决的问题是一个已经上线的大系统,花了两周时间。。。
0 请登录后投票
   发表时间:2015-06-09  
1:做一下压力测试吧,如楼上所说,可以缩小问题查找的范围,如问题可重现,那么就剩下修改代码了
2:尽量session中不要存放数据
3:项目启动时看看静态化的一些对象,没必要的就换为实时查询的方式也可
4:调整你的jvm参数,这个参数也很重要的,调整不对也会造成内存泄露的问题
0 请登录后投票
   发表时间:2015-06-09  
jmap dump 内存
mat 分析
1 请登录后投票
   发表时间:2015-06-10  
用eclipse mat分析看看,这工具可以看到这些LinkHashMap被哪些类产生的实例引用了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics