2010-03-31 12 views
5

La nostra azienda sta pianificando di passare a JVM a 64 bit per superare il limite di dimensione massima di 2 GB. Google mi ha fornito risultati molto contrastanti sulle prestazioni JVM a 64 bit. qualcuno ha provato di trasferirsi a 64 bit Java e condividere la vostra esperienzaEsperienza di passaggio a JVM a 64 bit

+0

x64 o non-x64? Per la maggior parte aumenta semplicemente l'utilizzo della memoria e quindi la larghezza di banda della memoria. Per x86, AMD ha creato un set di istruzioni meno folle di x86. –

+1

@Anders, non tutti sono così ossessionati da quei numeri come te! : P Alcune persone (puoi immaginare?) Rispondono solo per aiutare. –

+2

@Vladimir Dyuzhev: Obsessed non è il problema. È il modo in cui funziona la comunità. Risposta e accettazione sono il modo in cui si determina chi ha una storia di buone risposte. Nessuna accettazione significa nessuna storia di buone risposte. Senza la storia delle buone risposte, è difficile sapere quanta fiducia si possa dare una risposta. –

risposta

3

Se hai bisogno dell'heap più grande, le domande sulle prestazioni sono piuttosto discutibili, vero? O hai un piano per il ridimensionamento orizzontale?

Il problema principale che ho sentito con le app a 64 bit è che una garbage collection completa può richiedere molto tempo (perché si basa sul numero di oggetti live). Quindi vuoi ottimizzare con attenzione i parametri del GC per evitare raccolte complete (ho sentito un aneddoto su un'azienda con 64 Gb di heap e ho regolato il loro GC in modo che non avrebbero mai utilizzato un GC completo, avrebbero semplicemente chiuso giù una volta alla settimana).

Oltre a ciò, riconoscere che Java è a 32 bit in base alla progettazione, quindi non è probabile vedere un enorme aumento delle prestazioni dallo spostamento di dati a 64 bit alla volta. E tu sei ancora limitato agli indici di array a 32 bit.

+0

Abbiamo una JVM in cui gc funziona in parallelo, il che funziona bene, ma se gc non viene eseguito quando si avvia il prossimo gc, la JVM si arresta fino al termine del secondo gc. Cattivo! Succede un po 'perché il sistema operativo è molto aggressivo nello scambiare la memoria. –

+0

Puoi spiegare cosa intendi per Java a 32 bit di progettazione? da quello che so, Java è indipendente dalla piattaforma di progettazione no? – Pacerier

+0

L'osservazione di 32 bit in base alla progettazione è dispari. Quando discutiamo di 32/64/128 bit, solitamente si tratta della dimensione di un puntatore, che influisce sulla dimensione della memoria di lavoro. Il fatto che Java usi gli inte per gli array limita le dimensioni di un singolo array, ma un'astrazione come i buffer nio può essere utilizzata per aggirare efficacemente questo problema. Poiché questo non è perfetto, ci sono piani per consentire agli indici di essere lunghi. Tuttavia, non è una limitazione in un modo tecnico come un max heap di 4Gb. –

1

Abbiamo scritto direttamente a 64bit e posso vedere alcun comportamento negativo ...

3

funziona bene per noi. Perché non provi semplicemente a configurarlo ed esegui la tua suite di test di carico con un profiler come jvisualvm?

9

In poche parole: JVM a 64 bit consumeranno più memoria per i riferimenti agli oggetti e pochi altri tipi (generalmente non significativa), consumano più memoria per thread (spesso significativo sui siti ad alto volume) e consentono di avere cumuli di grandi dimensioni (in genere solo importanti se si dispone di molti oggetti longevi)

più lunghi risposte/commenti:

  • Il commento che Java è a 32 bit da design è fuorviante. Java l'indirizzamento della memoria è 32 o 64-bit, ma le specifiche VM assicurano che la maggior parte dei campi (ad esempio int, long, double, ecc.) Siano uguali.

  • Inoltre - la sintonizzazione GC commenti mentre pertinente per numero di oggetti, può non essere relativo, GC può essere veloce su JVM con grandi cumuli (ho lavorato con cumuli fino a 15 GB, con molto GC rapido) - Dipende più da come si gioca schemi di collettore generazionali e quale sia il tuo modello di utilizzo dell'oggetto . Mentre negli ultimi persone hanno speso un sacco di energia parametri di ottimizzazione, è molto carico di lavoro dipendente, e moderno (Java 5+) JVM sono molto bravi a self-tuning - a meno che non hai un sacco di dati è molto più rischia di farti male di aiuto con un'aggresiva messa a punto della JVM.

  • Come accennato su architetture x86, i EMT64 o x64 processori a 64 bit includono anche nuove istruzioni per fare le cose come le scritture atomiche, o altre opzioni che possono anche avere un impatto applicazioni ad alte prestazioni.

+0

Puoi spiegare cosa intendi per "campi (ad esempio int, long, double, ecc.) Sono gli stessi indipendentemente"? – Pacerier

1

Ingenuamente prendendo 32 carichi di lavoro JVM bit e la loro messa a 64 bit produce una performance e spazio ha colpito nella mia esperienza.

Tuttavia, la maggior parte dei principali fornitori di JVM ha ora implementato una buona tecnologia che essenzialmente comprime parte dell'heap - si tratta di riferimenti compressi o oops compressi per JVM a 64 bit che non sono "grandi" (ovvero: nel 4 -30 gb gamma).

Questo fa una grande differenza e dovrebbe rendere la transizione 32-> 64 molto più bassa.

di riferimento per l'IBM JVM: link text

+0

Penso che questo sia -XX: + UseCompressedOops per l'oracle jvm – Karussell

Problemi correlati