Подтвердить что ты не робот

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

У меня есть этот webapp, который нуждается в некоторой настройке памяти. Хотя я уже профилирую сам приложение и обрезаю вещи, сам 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 в startup.sh
  • У моего webapp в настоящее время есть код, который в производстве требует преимуществ от использования 64-битного.
  • Я заметил, что через некоторое время (в неделю) размер памяти JVMs (как показано сверху) в три раза превышает размер моей настройки -Xmx.
  • Размер памяти без кучи и т.д. являются относительно тривиальными, всего один процент от размера кучи
  • Существует только один раздел кода, для которого требуется адресное пространство с 64-разрядным битом

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

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

4b9b3361

Ответ 1

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

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

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

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

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

ИЗМЕНИТЬ

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