лямбда добавление к счетчику - PullRequest
0 голосов
/ 09 мая 2018

Итак, довольно быстрый вопрос:

Если у меня есть программа, которая использует много лямбда-выражений, создает ли каждая лямбда новый класс, который хранится в metaspace?

Обычнобыло бы хорошо, если бы он хранился там, но что, если вы также добавите java-флаг -Xnoclassgc, это создаст утечку, которая в конечном итоге приведет к сбою программы?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Добавление флага -Xnoclassgc не отключает все Garbage Collector. Отключает Garbage Collector классов только от PermGen.

Однако в JDK8 у нас больше нет PermGen, поскольку метаданные теперь перемещены в собственную память в область, известную как Metaspace.

С другой стороны, Lambda выражения в Java - это экземпляры из Функциональные интерфейсы ( функциональный интерфейс - это интерфейс, который содержит ровно один абстрактный метод ).

Другими словами, лямбды objects обрабатываются как другие объекты и хранятся в куче, поэтому компилятор не создает файл .class для каждого экземпляра лямбды.

0 голосов
/ 09 мая 2018

Короткий ответ - нет.

Под капотом они используют инструкцию, введенную в Java 7 - invokedynamic

Вы можете посмотреть эту презентацию для получения дополнительной информации - https://www.infoq.com/presentations/lambda-invokedynamic

...