jvm 内存泄漏排查过程

最近两周发现定时任务系统占用内存一直增高,之前占用1.5G左右,现在内存是一直增高,并且无止境的趋势,由于本系统和其他系统部署在一台服务器,服务器设置了内存超过85%就会报警,导致经常报警。于是肯定是程序存在内存泄漏了,于是就开启了排查。

一、通过VisualVM查看内存占用情况,发现某个实体类对象大量存在,如下图:

于是就找引用这个类的相关代码,最初发现循环里面检索列表对象,于是把列表转换成了map对象存储,循环里面通过key到map里面查找对象,于是修改了一般,发布到生产环境,发现问题还在继续。

二、尽然问题没有解决,VisualVM查看不到更详细的信息,这时候我dump了jvm所有对象信息,在通过VisualVM打开看,发现存在字符比较多,展开看到大量的打印日志,如下图:

内存增长点终于找到了,在回到代码,发现打印了大数据量的list。于是把相关打印去掉,再发布了一般,观察下来,内存正常了,没有持续增长。终于解决。

三、问题分析:

1、json.toJsonString(List),如果List的数据量比较大,json会生成一个比较大对象,这时候会直接进入老年代(jvm内存分配过小,还会产生oom)导致jvm的minor GC不能回收,所以占用内存会越来越多。只有full GC的时候才会回收。

四、结论:

1、不要再循环中查找大数据量list对象;

2、对于大数据量list千万不要打印,如果真的需要打印,也应该把list拆分成小的进行打印。

如果对你有帮助,就点个赞吧!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值