JEP 149: Reduce Core-Library Memory Usage
Сокращение потребления памяти классами базовой библиотеки
| Authors | Roger 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 или сериализацию. Методы доступа к информации рефлексии и аннотаций не особенно чувствительны к производительности, но влияние дополнительного уровня косвенности на производительность следует измерить и, возможно, сгладить.
В целом перенос редко используемых полей во вспомогательные классы сократит число выделений памяти в типичном случае, но дополнительный уровень косвенности может повлиять на производительность, и это влияние нужно измерить и учесть.
Кандидат: отключение компилятора рефлексии
Компилятор рефлексии генерирует байт-код для вызовов методов, чтобы повысить производительность. Отключение компилятора сократило бы объём используемой динамической памяти. На специально подобранных тестах потеря производительности может быть значительной, но в типичных приложениях, которые не слишком полагаются на рефлексию, она, как ожидается, будет довольно небольшой.
Кандидат: прочие способы сокращения памяти
Другие способы сократить потребление памяти нужно найти, анализируя использование кучи в приложениях-кандидатах. Возможные способы включают настройку начальных размеров внутренних таблиц, кэшей и буферов, чтобы уменьшить потери памяти.