jvm 内存泄漏排查过程

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

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

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

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

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

三、问题分析:

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

四、结论:

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

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

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

发布了18 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/chuhx/article/details/103938129