Що робить прапор JVM UseCompressedOops і коли мені його використовувати?


85

Що робить прапор HotSpot JVM -XX:+UseCompressedOopsі коли мені його використовувати? Яку різницю в продуктивності та використанні пам’яті я побачу, використовуючи її на 64-розрядному екземплярі Java (проти невикористання)?


1
Він стискає 64-розрядні покажчики. Ви побачите зменшення обсягу пам’яті через збільшення розміру покажчика, менше часу, проведеного в GC, можливо, невелике зниження продуктивності. jdk1.6.0_22 був останнім JVM Sun, який вимкнув цей прапор за замовчуванням.
sjr

Відповіді:


86

У більшості HotSpot JVM за останній рік це було включено за замовчуванням. Цей параметр дозволяє посиланням бути 32-розрядними в 64-розрядному JVM і мати доступ до 32 ГБ купи. (можуть більше 32-розрядних покажчиків) (Ви також можете мати майже необмежену пам’ять без кучі). Це може заощадити значний обсяг пам'яті та потенційно покращити продуктивність.

Якщо ви хочете скористатися цією опцією, я пропоную вам оновити її до версії, яка ввімкнена за замовчуванням, оскільки, можливо, були поважні причини, такі як помилки, чому її раніше не вмикали. Спробуйте Java 6 оновлення 23 або Java 7 оновлення 5.

Коротше кажучи, не вмикайте його, використовуйте версію, яка має це за замовчуванням.


Оновлення:

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


Я прочитав цю статтю: community.oracle.com/message/10019916, де сказано, що ми завжди повинні використовувати цей прапор вручну, навіть якщо він увімкнений за замовчуванням. Будь-які думки?
ванваль

1
@vanval Це рекомендується, якщо ви використовуєте. JE cache Це тому, що з якихось причин не вдається зрозуміти, використовуєте ви компреси на жаль. Я можу придумати кілька методів, які можуть сказати вам це до речі. Вам не потрібно вказувати його в командному рядку IMHO, якщо ви не хочете, щоб JVM вийшов з ладу, якщо це не ввімкнено. наприклад, у вас є купа 64 ГБ на Java 8.
Пітер Лорі,

3
Я щойно провів кілька тестів на Win8 x64 i7-4702MQ JDK 8 u40 із 7 ГБ xms та xmx, із 7 ГБ 5,4 ГБ використовуються великим деревом, завантаженим із Access db. Моя думка полягає в тому, що: вручну вказівка ​​прапора -XX: + UseCompressedOops призводить до 20% зниження продуктивності (при генерації великого дерева) та ще 1 (від 3 до 4) тривалої паузи GC (із GC за замовчуванням). Ви сприймаєте це як зниження продуктивності або як збільшення паузи в GC. У будь-якому випадку, це було на 20% повільніше.
zmirc

1
Кожна програма має власну пам’ять та профіль використання. У нашому випадку, настільний додаток із 32-бітним jvm, прапорець + UseCompressedOops зберігає день, оскільки він зберігає достатньо низьке використання пам’яті, щоб вміститися на старій машині клієнта на 4 Гб, і збільшує продуктивність на 30% порівняно з 32-бітним jvm.
Alex Byrth,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.