Loading

OutOfMemoryError: 对象内list无限制add导致的oom

对象内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);
} 

在超出比较多的时候抛出异常,提醒调用的地方,这个地方有问题。

posted @ 2021-03-16 20:46  lijuny  阅读(365)  评论(0编辑  收藏  举报