java.lang.OutOfMemoryError: Java heap space;
在一次项目运行过程中,突然发现某一个轮询方法直接报java heap space;直接导致应用无法正常使用;数据无法查询出来。
根据日志提示,直接找到相关的方法,暂时屏蔽了相关的轮询方法。
由于没有做过相关的JVM调试,且在搜索过程中大部分的调试是直接调整JVM参数,感觉没有多大作用。
初步尝试:
将服务器的代码下载到本地,将轮询设置成开发环境也能运行;通过JDK自带的相关工具直接显示相关的内存使用情况;发现String类型的数据占比长期高达89%;由此怀疑是因为这个方法里面的逻辑有错误,导致GC无法回收;
初次尝试审核代码:
通过审查代码发现,逻辑上没有严重的失误,但是轮询有多个嵌套循环,至此怀疑是嵌套循环有问题
初步改代码:
通过梳理该轮询的业务逻辑,发现写的代码有严重的失误;主要是消息体循环时没有去重,导致如果没有人来处理该消息,消息体会越来越大,循环也会越来越久;初步揣测由于此处引发的内存问题;着手将代码进行去重处理,重新运行程序,发现String类型数据虽然占比有所下降,但是还是很高,有65%以上;
最终处理:
通过搜索相关的问题,网上有怀疑是因为String对象的不断生成,如果不回收的话会造成内存泄漏的情况;通过本人再次对代码进行分析;初步揣测是因为此处的代码生成了很多个list<Map<String,Object>>;如果轮询没有处理完,则会导致String类型数据的增多?对代码再次分析后发现,有多处的List是不需要等方法执行完的,且依赖关系并不是很多;所以我大胆的在不需要这些List的时候将里面的内容remove;重新运行之后,发现String类型的占比一直维持在23%左右,至此,问题解决!