Какое влияние оказывает ключ -d64 на использование резидентной памяти Sun JVM? - PullRequest
11 голосов
/ 18 сентября 2009

У меня есть это веб-приложение, которое нуждается в настройке памяти. В то время как я уже профилирую само приложение и все улаживаю, сама JVM кажется мне слишком раздутой в нашем самом загруженном случае. (У экземпляров меньшего объема такой проблемы нет.) Подробности:

  • Платформа:
    • RHEL4 64-бит (Linux 2.6.9-78.0.5.ELsmp #1 SMP x86_64)
    • Sun Java 6 (Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode))
    • Tomcat 6 с -d64 in startup.sh
  • В моем веб-приложении в настоящее время есть некоторый код, который при работе требует преимуществ 64-битной работы.
  • Я заметил, что через некоторое время (неделю) размер резидентной памяти JVM (как показано сверху) составляет в три раза размера моего параметра -Xmx.
  • Размер памяти, не относящейся к куче, и т. Д. Все относительно тривиальны, это всего лишь одна цифра в процентах от размера кучи
  • Существует только одна часть кода, которая требует 64-битное адресное пространство

Если бы я мог реорганизовать необходимость в 64-битной JVM и отбросить переключатель -d64, это уменьшило бы объем резидентной памяти JVM? Другими словами ...

Какое влияние оказывает переключатель -d64 на использование резидентной памяти Sun JVM, если таковой имеется?

1 Ответ

18 голосов
/ 18 сентября 2009

Использование переключателя d64 переводит JVM в 64-битный режим. Технически, в Solaris / Linux и большинстве Unixes процесс JVM будет выполняться в модели LP64.

Модель LP64 отличается от 32-битной модели (ILP32) тем, что указатели имеют ширину 64 бита, а не 32-битные указатели. Для JVM это обеспечивает большую адресуемость памяти, но это также означает, что размер, занимаемый только ссылками на объекты, удвоился. Таким образом, в 32-разрядной JVM и в 64-разрядной версии для одного и того же числа объектов в определенный момент времени больше.

Другая вещь, о которой часто забывают, это размер самих инструкций. На 64-битной JVM размер инструкций будет занимать собственный размер регистра машины.

Если, однако, вы используете сжатые указатели объектов в 64-разрядной среде, JVM будет по возможности кодировать и декодировать указатели для размеров кучи, превышающих 4 ГБ. Вкратце, при использовании сжатых указателей JVM пытается максимально использовать 32-разрядные значения.

Подсказка: включите флаг UseCompressedOops, используя -XX: + UseCompressedOops , чтобы избавиться от некоторых проблем. YMMV, но люди сообщили о 50% -ном падении памяти, используя сжатые oops .

EDIT

Флаг UseCompressedOops поддерживается в версии 14.0 виртуальной машины Java HotSpot, доступной в Java 6 с последующим обновлением 14 .

...