Повышение производительности Java Hotspot VM: сжатый указатель на обычный объект

Обычный указатель объекта (oop, ordinary object pointer) для Java Hotspot - это управляемый указатель на объект. Как правило, oop имеет тот же размер, что и собственный указатель компьютера, который является 64-разрядным в системе LP64. В системе ILP32 максимальный размер кучи составляет менее 4 гигабайт, что недостаточно для многих приложений. В системе LP64 куча, используемая данной программой, может быть примерно в 1,5 раза больше, чем при работе в системе ILP32. Это требование связано с расширенным размером управляемых указателей. Память стоит недорого, но в наши дни пропускная способность и кэш ограничены, поэтому нежелательно значительно увеличивать размер кучи и получать только более 4 ГБ.

Управляемые указатели в куче Java указывают на объекты, которые выровнены по 8-байтовым границам адресов. Сжатые операции представляют управляемые указатели (во многих, но не во всех местах программного обеспечения виртуальной машины Java (JVM)) в виде 32-битных смещений объектов от 64-битного базового адреса кучи Java. Поскольку это смещения объектов, а не смещения байтов, oops можно использовать для адресации до четырех миллиардов объектов (не байтов) или размера кучи до 32 гигабайт. Чтобы их использовать, их нужно масштабировать в 8 раз и добавить к базовому адресу кучи Java, чтобы найти объект, к которому они относятся. Размеры объектов, использующих сжатые значения, сравнимы с размерами в режиме ILP32.

Термин декодирование относится к операции, с помощью которой 32-разрядный сжатый параметр преобразуется в 64-разрядный собственный адрес и добавляется в управляемую кучу. Термин кодировать относится к этой обратной операции.

Сжатый oop поддерживается и включается по умолчанию в Java SE 6u23 и более поздних версиях. В Java SE 7 сжатые операции по умолчанию включены для 64-разрядных процессов JVM, когда -Xmx не указан и для значений -Xmx менее 32 гигабайт. Для выпусков JDK более ранних, чем выпуск 6u23, используйте флаг -XX:+UseCompressedOops с командой java, чтобы включить сжатые операции.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки