Как измерить затраты памяти на лямбды в Java 25?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как измерить затраты памяти на лямбды в Java 25?

Сообщение Anonymous »

Если я запускаю Java 25 JShell с библиотекой макета объектов Java (JOL) без каких-либо настроек JVM и измеряю стоимость памяти в байтах Predicate, я вижу следующее:
$ jshell --class-path ~/.m2/repository/org/openjdk/jol/jol-core/0.17/jol-core-0.17.jar
| Welcome to JShell -- Version 25.0.1
| For an introduction type: /help intro

jshell> Predicate predicate = (x) -> true
predicate ==> $Lambda/0x0000080001048000@439f5b3d

jshell> import org.openjdk.jol.info.*

jshell> IO.println(GraphLayout.parseInstance(predicate).toFootprint())

REPL.$JShell$2$$Lambda/0x0000080001048000@439f5b3dd footprint:
COUNT AVG SUM DESCRIPTION
1 16 16 REPL.$JShell$2$$Lambda/0x0000080001048000
1 16 (total)

Если я запускаю тот же код с включенными компактными заголовками объектов (COH), я вижу следующее:
$ jshell --class-path ~/.m2/repository/org/openjdk/jol/jol-core/0.17/jol-core-0.17.jar -R-XX:+UseCompactObjectHeaders
| Welcome to JShell -- Version 25.0.1
| For an introduction type: /help intro

jshell> Predicate predicate = (x) -> true
predicate ==> $Lambda/0x00000fe001049400@1d56ce6a

jshell> import org.openjdk.jol.info.*

jshell> IO.println(GraphLayout.parseInstance(predicate).toFootprint())

REPL.$JShell$2$$Lambda/0x00000fe001049400@1d56ce6ad footprint:
COUNT AVG SUM DESCRIPTION
1 8 8 REPL.$JShell$2$$Lambda/0x00000fe001049400
1 8 (total)

Хотя может показаться, что я ответил на свой вопрос, я не уверен, что ответил.
Будут ли 16 байтов (COH выключен) или 8 байтов (COH включен) для лямбды без сохранения состояния выделены один раз и подняты статически или будут выделены при каждом обнаружении лямбды в коде?
Я могу написать код для загрузки экземпляров лямбды в список как следует.
List list = IntStream.range(0, 1000000)
.mapToObj(each -> (x) -> x.isEmpty())
.toList()

Даст ли это мне ответ, который я ищу для лямбда-выражений без сохранения состояния? Может ли это зависеть от реализации JVM? Что произойдет со стоимостью, если лямбда-выражение включает локальную переменную или захват поля, как показано ниже?
List list = IntStream.range(0, 1000000)
.mapToObj( each -> (x) -> x.isEmpty() || each % 2 == 0)
.toList()
Ответить

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

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

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

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

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