Desempenho horrível e grande volume de heap da referência do construtor Java 8?
Eu apenas tive uma experiência bastante desagradável em nosso ambiente de produção, causandoOutOfMemoryErrors: heapspace..
Rastreei o problema pelo meu uso deArrayList::new
em uma função.
Para verificar se isso está realmente executando pior que a criação normal por meio de um construtor declarado (t -> new ArrayList<>()
), Escrevi o seguinte método pequeno:
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);
}
}
}
}
Executando o método comnewMethod=true;
fará com que o método falhe comOutOfMemoryError
logo após o índice atingir 30k. ComnewMethod=false;
o programa não falha, mas continua batendo até ser morto (o índice atinge facilmente 1,5 milhão).
PorqueArrayList::new
criar tantosObject[]
elementos na pilha que causaOutOfMemoryError
tão rápido?
(A propósito - isso também acontece quando o tipo de coleção éHashSet
.)