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: инструменты, которым известны форматы метаданных классов