对象内list无限制add导致的oom
问题发现
今天生产环境突然发先一个服务里面出现了OOM。
堆栈
分析以上堆栈发现在CompiledlSScriptImpl
中的某个字段出现了内存泄漏。
定位代码:
发现在 CompiledlSScriptImpl
中有如下的代码:
private List<String> list = new ArrayList<>;
public void func(String str) {
if (list.size() > 10000) {
log.warn("msg");
}
list.add(str);
}
这个方法频繁被外部一个有问题的代码调用。而超过10000的时候会出现警告但是还是会往list中添加。
解决
public void func(String str) {
if (list.size() > 10000) {
log.warn("msg");
return;
}
list.add(str);
}
解决方式如上所示,增加一个return即可。
增强
private int count;
public void func(String str) {
count++;
if (list.size() > 10000) {
if (count == 10001) {
log.warn("msg");
} if (count > 100000) {
throw new RuntimeException("msg");
}
return;
}
list.add(str);
}
在超出比较多的时候抛出异常,提醒调用的地方,这个地方有问题。