Cosa fa il flag JVM UseCompressedOops e quando dovrei usarlo?


85

Cosa fa il flag HotSpot JVM -XX:+UseCompressedOopse quando dovrei usarlo? Che tipo di differenze di prestazioni e utilizzo della memoria vedrò quando lo utilizzerò su un'istanza Java a 64 bit (rispetto al non utilizzo)?


1
Comprime i puntatori a 64 bit. Vedrai una riduzione della memoria gonfiata dalla maggiore dimensione del puntatore, meno tempo speso in GC, forse un piccolo calo delle prestazioni. jdk1.6.0_22 è stata l'ultima Sun JVM ad avere questo flag disattivato per impostazione predefinita.
sjr

Risposte:


87

La maggior parte di HotSpot JVM nell'ultimo anno lo ha attivato per impostazione predefinita. Questa opzione consente ai riferimenti di essere a 32 bit in una JVM a 64 bit e di accedere a quasi 32 GB di heap. (più di puntatori a 32 bit possono) (Puoi anche avere una memoria heap quasi illimitata). Ciò può far risparmiare una notevole quantità di memoria e potenzialmente migliorare le prestazioni.

Se vuoi utilizzare questa opzione ti suggerisco di aggiornare a una versione che lo ha per impostazione predefinita in quanto potrebbe esserci stata una buona ragione, come i bug, perché non era abilitato in precedenza. Prova l'aggiornamento 23 di Java 6 o l'aggiornamento 5 di Java 7.

In breve, non accenderlo, usa una versione che lo ha per impostazione predefinita.


Aggiornare:

In Java 8 hai la possibilità di impostare il -XX:ObjectAlignmentInBytes=e infatti se la dimensione dell'heap su 64 GB utilizzerà -XX:ObjectAlignmentInBytes=16e utilizzerà ancora riferimenti a 32 bit.


Ho letto questo articolo: community.oracle.com/message/10019916 che afferma che dovremmo sempre usare questo flag manualmente anche se è abilitato di default. qualche idea?
Vanval

1
@vanval Questo è consigliato se stai usando JE cache Questo perché non può capire se stai usando compresses oops o no per qualche motivo. Posso pensare ad alcuni metodi che possono dirti questo btw. Non dovrebbe essere necessario specificarlo sulla riga di comando IMHO a meno che non si desideri che la JVM fallisca se non è abilitata. es. hai un heap da 64 GB su Java 8.
Peter Lawrey

3
Ho appena eseguito alcuni test su Win8 x64 i7-4702MQ JDK 8 u40 con 7 GB xms e xmx, su 7 GB, 5,4 GB sono utilizzati da un grande albero caricato da un database di accesso. Il mio punto è: specificare manualmente il flag -XX: + UseCompressedOops porta a una riduzione delle prestazioni del 20% (quando si genera l'albero grande) e un'altra pausa GC lunga (da 3 a 4) (con GC predefinito). Lo prendi come una diminuzione delle prestazioni o come un aumento della pausa GC. In ogni caso, è stato del 20% più lento.
zmirc

1
Ogni applicazione ha la propria memoria e il proprio profilo di utilizzo. Nel nostro caso, un'app desktop proveniente da jvm a 32 bit, il flag + UseCompressedOops salva la giornata, poiché ha mantenuto l'utilizzo della memoria abbastanza basso da adattarsi alla vecchia macchina da 4 GB del cliente e ha aumentato le prestazioni del 30%, rispetto a 32 bit jvm.
Alex Byrth
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.