Почему escape-анализ не запускается в этом конкретном примере?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему escape-анализ не запускается в этом конкретном примере?

Сообщение Anonymous »

Это открытый JDK 17, и все тесты выполняются с памятью 256 МБ. Я тестировал взаимодействие escape-анализа с потоками с помощью нескольких простых тестов и столкнулся с чем-то интересным.
Приведенный ниже код отлично запускает escape-анализ (проверено добавлением -verbose:gc< /code> и запуск кода с -XX:-DoEscapeAnaлиз. Запускается без активности EA для печати GC, а с EA - нет)

Код: Выделить всё

public static int mapSum_boxed(){
record TestObject(int i){};
return IntStream.range(0, 1_000_000_000)
.boxed()
.map(x-> new TestObject(1))
.mapToInt(x-> x.i())
.sum();
}
Отмечу, что это не сравнительный тест. Я просто вызываю функцию из основного метода следующим образом:

Код: Выделить всё

public static void main(String[] args) {
System.out.println(mapSum_boxed());
}
Выходные данные, которые я получаю в результате приведенного выше вызова (с флагом -verbose:gc):

Код: Выделить всё

> Task :org.example.Main.main()
[0.002s][info][gc] Using G1
1000000000
Однако, если я внесу изменение ниже (добавлю дополнительную карту()), это не сможет запустить escape-анализ, и я получу активность GC, выведенную на консоль:
р>

Код: Выделить всё

public static int mapSum_boxed(){
record TestObject(int i){};
return IntStream.range(0, 1_000_000_000)
.boxed()
.map(x-> 1) //  new TestObject(1))
.mapToInt(x-> x.i())
.sum();
}
На этот раз результаты:

Код: Выделить всё

> Task :org.example.Main.main()
[0.002s][info][gc] Using G1
[0.053s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 23M->2M(246M) 1.398ms
[0.117s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 120M->2M(246M) 0.965ms
.... // many many more lines of GC
[6.530s][info][gc] GC(123) Pause Young (Normal) (G1 Evacuation Pause) 258M->2M(428M) 0.724ms
1000000000
Кто-нибудь знает, почему это происходит? Сначала я думал, что операция map(x->1) каким-то образом преобразует весь поток в тип Integer, но это кажется маловероятным... и это действительно должно было произойти в boxed()< /code> в любом случае.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ar-example
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»