Ужасная производительность и большой объем ссылок на конструктор 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.)

Ответы на вопрос(2)

Ваш ответ на вопрос