Che cosa fa il flag JVM di UseCompressedOops e quando dovrei usarlo?

Che cosa fa l’indicatore JVM dell’hotspot -XX:+UseCompressedOops e quando dovrei usarlo? Che tipo di prestazioni e differenze di utilizzo della memoria vedrò quando lo utilizzo su un’istanza Java a 64 bit (rispetto a non usarla)?

La maggior parte di HotSpot JVM nell’ultimo anno è stata triggersta per impostazione predefinita. Questa opzione consente ai riferimenti di essere 32 bit in una JVM a 64 bit e di accedere quasi a 32 GB di heap. (più di puntatori a 32 bit possono) (Puoi anche avere memoria illimitata di heap). Ciò può salvare una quantità significativa di memoria e potenzialmente migliorare le prestazioni.

Se si desidera utilizzare questa opzione, suggerisco di aggiornare ad una versione che lo ha triggersto per impostazione predefinita in quanto potrebbe esserci stata una buona ragione, come bug, perché non è stato abilitato in precedenza. Prova Java 6 update 23 o Java 7 update 5.

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


Aggiornare:

In Java 8 si ha la possibilità di impostare -XX:ObjectAlignmentInBytes= e infatti se si -XX:ObjectAlignmentInBytes= dimensioni a 64 GB verrà utilizzato -XX:ObjectAlignmentInBytes=16 e si utilizzano ancora riferimenti a 32 bit.