一次内存溢出的排查过程

问题描述:

    项目运行的时间长了,数据量上去了,隐藏的一些问题也就出现了。之前有一个项目一直跑的挺稳定的,但是几个月之后突然在监控中 发现程序执行错误。迅速登上服务器进行查看发现是抛出了java.lang.OutOfMemoryError: Java heap space错误,通过错误大概就可以判断出是因为内存不足以分配新的对象而导致的,而这种情况一般可能是由于在循环中创建了过多的对象,比如放入了集合中,而集合没能释放掉,导致内存一直在增加。但是我自己来回找了几遍代码也没能发现问题代码在哪。(事后证明还是自己不够细心)

没办法只能是借助工具了。

解决过程:

刚开始在网上找了找,发现各种不靠谱,用到了一些第三方工具,还需要下载,而我这是内网也不方便,所以就自己尝试使用java官方自带工具进行解决。

     用到了jmap工具

发现了使用量最大的3个就是HashMap,String,Char[]

接下来本来是想用jmap工具dump出堆的,但是发现dump出的堆过于大7.5个G。并且在使用jhat进行分析时,非常消耗时间与性能。所以我就直接进入代码进行排查了。

 

首先可以确定是因为创建了过多的map对象造成的内存占用,那么我可以先把所有创建map对象的方法与类找出来,接下来就是排查可能导致内存溢出的问题:

1.是否有在循环中调用添加却没有释放集合

2.是否有成员变量,使用完没有进行清除。

3.是否有死循环。

 

果不其然,被我发现了一个之前没有注意到的地方,是因为一个成员变量一直在添加对象到集合中,却没有进行清除。我地乖乖,真的坑。以后写,一定得注意。

 

 

最后欢迎大家批评指正,您的建议就是我前进的动力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值