Java 8 构造函数引用的可怕性能和大堆占用空间?
我只是在我们的生产环境中有过一次相当不愉快的经历,导致OutOfMemoryErrors: heapspace..
我将问题追溯到我在函数中使用。ArrayList::new
为了验证这实际上比通过声明的构造函数()的正常创建更差,我编写了以下小方法:t -> new ArrayList<>()
public class TestMain {
public static void main(String[] args) {
boolean newMethod = false;
Map<Integer,List<Integer>> map = new HashMap<>();
int index = 0;
while(true){
if (newMethod) {
map.computeIfAbsent(index, ArrayList::new).add(index);
} else {
map.computeIfAbsent(index, i->new ArrayList<>()).add(index);
}
if (index++ % 100 == 0) {
System.out.println("Reached index "+index);
}
}
}
}
运行 with 方法将导致该方法在索引命中 30k 后立即失败。随着程序不会失败,但不断冲击直到杀死(索引很容易达到1.5百万)。newMethod=true;
OutOfMemoryError
newMethod=false;
为什么在堆上创建如此多的元素,以至于它产生的速度如此之快?ArrayList::new
Object[]
OutOfMemoryError
(顺便说一句 - 当集合类型为 .)HashSet