1、问题

设置预约内容时出现OOM。

2、分析过程

2.1、通过jvisualvm打开堆栈数据:java_pid6.hprof

img

2.2、点击oom线程链接

  • 可以发现问题处在HashMap的computeIfAbsent方法中

img

2.3、查看出问题的代码(98行)

  • 可以看到computeIfAbsent方法的第一个入参为:订单id,第二个参数为:ArrayList::new

img

2.4、查询HashMap源码(1127行)

  • 这里的mappingFunction是new ArrayList(key)
  • key为:订单id
  • 当订单id过大时,会出现OOM

img

2.5、复现问题

1
2
3
4
5
6
public class OomDemo {    
public static void main(String[] args) {
Map<Integer, List<String>> map = Maps.newHashMap();
map.computeIfAbsent(999999999, ArrayList::new);
}
}

img

3、思考

3.1、如何规避

  • 指定Map中value对应的集合的大小,如:
1
2
3
4
5
6
public class OomDemo {
public static void main(String[] args) {
Map<Integer, List<String>> map = Maps.newHashMap();
map.computeIfAbsent(999999999, e -> new ArrayList<>(1));
}
}