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

JEP 147: Reduce Class Metadata Footprint

Сокращение объёма памяти, занимаемого метаданными классов

ОтветственныйJiangli Zhou
ТипFeature
ОбластьImplementation
СтатусClosed / Delivered
Выпуск8
Компонентhotspot / runtime
Обсуждениеhotspot dash runtime dash dev at openjdk dot java dot net
ТрудоёмкостьL
ДлительностьL
РецензентыBob Vandette
ОдобренMikael Vidstedt
Создан2011/10/17 20:00
Обновлён2014/08/08 20:54
Задача8046137

Аннотация

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

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

Сократить объём памяти, занимаемый метаданными классов, методов и полей, на 25 %. Объём измеряется как пространство, занимаемое соответствующими структурами данных (без учёта пространства, занимаемого байт-кодом и интернированными строками).

Производительность запуска и выполнения типичных приложений не должна ухудшиться больше чем на 1 %.

Описание

Многие приёмы сокращения памяти, применяемые в CVM (встраиваемой JVM для Java ME CDC), можно применить и в HotSpot. Например:

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

  • Делать все поля структур как можно меньше.

  • Кодировать некоторые поля так, чтобы они помещались в типы меньшего размера.

  • Не смешивать поля разного размера так, чтобы возникало лишнее выравнивание (т. е. группировать типы близкого размера).

  • Для некоторых видов данных использовать 16-битные смещения вместо 32-битных указателей.

  • Использовать объединения (union) для групп полей, если одновременно используется не больше одного из них. Некоторые поля будут иметь разный смысл в зависимости от состояния, в котором находится класс.

  • Не хранить cb* в каждом fb и mb.

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

  • Данные, связанные со скомпилированными методами, не выделяются, пока метод не скомпилирован.

  • Сохранение отладочной информации Java необязательно и в производственных сборках обычно отключено.

  • Элементы пула констант (включая информацию о типе) занимают 40 бит.

  • Сжать битовую карту GC, описывающую, какие поля класса имеют ссылочные типы. Обычно она умещается всего в 32 бита.

  • Ограничить количество вызовов malloc и связанные с каждым вызовом malloc накладные расходы на блок при выделении памяти для загруженного класса. Бо́льшая часть класса размещается в одном большом блоке, выделенном через malloc.

Например, следующие четыре логических поля в instanceKlass.hpp можно объединить в одно поле u1:

bool _is_marked_dependent;   // used for marking during flushing & deopt
bool _rewritten;             // methods rewritten
bool _has_nonstatic_fields;  // for sizing with UseCompressedOops
bool _should_verify_class;   // allow caching of preverification

Влияние

  • Другие компоненты JDK: инструменты, которым известны форматы метаданных классов