openjdk.ruOpenJDK на русском

JEP 149: Reduce Core-Library Memory Usage

Сокращение потребления памяти классами базовой библиотеки

AuthorsRoger Riggs, Hinkmond Wong, David Holmes
ОтветственныйRoger Riggs
ТипFeature
ОбластьImplementation
СтатусClosed / Delivered
Выпуск8
Компонентcore-libs
Обсуждениеcore dash libs dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьM
РецензентыBrian Goetz
ОдобренBrian Goetz
Создан2012/01/04 20:00
Обновлён2016/02/18 21:20
Задача8046139

Аннотация

Сократить объём динамической памяти, используемой классами базовой библиотеки, не ухудшая производительность.

Критерии успеха

Для оценки пользы и влияния этих изменений будут использоваться существующие нагрузки и метрики, в том числе SPECjbb2005 и SPECjvm98.

Мотивация

Сокращение потребления динамической памяти (кучи) классами базовой библиотеки увеличит размер приложений, которые можно запустить в пределах заданного объёма памяти, выделенного среде выполнения Java. Кроме того, при том же объёме динамической памяти можно будет запускать больше приложений, а за счёт более эффективного использования памяти вырастет пропускная способность приложений.

Описание

Поиск практических способов сократить объём динамической памяти ведётся так же, как и другая работа над производительностью. Мы определим и изучим типичные нагрузки, чтобы найти вероятные возможности для улучшений. Для различных улучшений классов библиотеки, которые сокращают использование кучи и улучшают связанные с ними нативные реализации, будут созданы прототипы, и их эффективность будет оценена. Влияние на производительность будет измеряться с помощью существующих нагрузок и метрик, в том числе SPECjbb2005 и SPECjvm98.

Будут внесены улучшения, которые сокращают использование динамической памяти, не влияют на производительность и которые можно сопровождать в исходном коде в долгосрочной перспективе. Изменения, которые эффективны только для некоторых приложений, должны быть настраиваемыми, чтобы их можно было включать или отключать по мере необходимости.

Кандидат: уменьшение размеров объектов

Некоторые поля в java.lang.Class используются только тогда, когда к классу применяются определённые операции, например рефлексия, доступ к аннотациям и переопределение класса (через JVMTI).

Если перенести эти поля в отдельный вспомогательный класс, размер объектов Class может уменьшиться, когда эти поля не нужны. Однако, с другой стороны, нужно учитывать, что если нужно хотя бы одно из этих полей, то мы не только возвращаемся к прежнему фактическому размеру объекта, но и добавляем 4 байта на ссылку на вспомогательный объект и 8 байт на сам вспомогательный объект.

Поля, поддерживающие кэширование данных рефлексии и аннотации, можно перенести во вспомогательный класс без влияния на VM или сериализацию. Методы доступа к информации рефлексии и аннотаций не особенно чувствительны к производительности, но влияние дополнительного уровня косвенности на производительность следует измерить и, возможно, сгладить.

В целом перенос редко используемых полей во вспомогательные классы сократит число выделений памяти в типичном случае, но дополнительный уровень косвенности может повлиять на производительность, и это влияние нужно измерить и учесть.

Кандидат: отключение компилятора рефлексии

Компилятор рефлексии генерирует байт-код для вызовов методов, чтобы повысить производительность. Отключение компилятора сократило бы объём используемой динамической памяти. На специально подобранных тестах потеря производительности может быть значительной, но в типичных приложениях, которые не слишком полагаются на рефлексию, она, как ожидается, будет довольно небольшой.

Кандидат: прочие способы сокращения памяти

Другие способы сократить потребление памяти нужно найти, анализируя использование кучи в приложениях-кандидатах. Возможные способы включают настройку начальных размеров внутренних таблиц, кэшей и буферов, чтобы уменьшить потери памяти.