Что делает флаг UseCompressedOops JVM и когда я должен его использовать?

Что делает флаг HotSpot JVM -XX:+UseCompressedOops и когда я должен его использовать? Какие различия в производительности и использовании памяти я увижу при использовании его на 64-битном экземпляре Java (вместо того, чтобы не использовать его)?

Ответ 1

Большинство HotSpot JVM в прошлом году использовали его по умолчанию. Этот параметр позволяет ссылаться на 32-битные ссылки в 64-битной JVM и получить доступ к 32 ГБ кучи. (может быть более 32-разрядных указателей) (у вас может быть и неограниченная память кучи). Это может сэкономить значительное количество памяти и потенциально повысить производительность.

Если вы хотите использовать эту опцию, я предлагаю вам обновить версию, на которой она включена по умолчанию, поскольку, возможно, была веская причина, например, ошибки, почему она не была включена ранее. Попробуйте обновить версию обновления для Java 6 или версию 7 на Java 7.

Короче говоря, не включайте его, используйте версию, которая по умолчанию включена.


Update:

В Java 8 вы можете установить -XX:ObjectAlignmentInBytes=, и на самом деле, если вы купите размер до 64 ГБ, он будет использовать -XX:ObjectAlignmentInBytes=16 и все еще использовать 32-битные ссылки.