Ужасная производительность и большой объем ссылок на конструктор 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);
}
}
}
}
Запуск метода сnewMethod=true;
приведет к сбою метода сOutOfMemoryError
сразу после того, как индекс достиг 30к. СnewMethod=false;
программа не дает сбоя, но продолжает колотиться до тех пор, пока не будет уничтожена (индекс легко достигает 1,5 миллиона).
ПочемуArrayList::new
создать так многоObject[]
элементы в куче, что это вызываетOutOfMemoryError
так быстро?
(Кстати, это также происходит, когда тип коллекцииHashSet
.)