Если я запускаю 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()
Как измерить затраты памяти на лямбды в Java 25? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1777372376
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()
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия