2013-07-16 12 views
7

Con l'ottimizzazione GC riesco a ottenere prestazioni per applicazioni java in tempo reale ed evitare pause riconoscibili del GC. Ma ciò vale fino a ~ 20 GB di spazio heap.Scalatura verticale dell'applicazione Java real-time

La riduzione del costo dell'hardware ha reso accessibili anche 100 GB di RAM. Ma, ancora con Java a causa delle pause di GC, dimensioni di heap più elevate come 50 GB possono mandarti in incubo a intervalli regolari.

Capisco che ci siano opzioni come off-heap e heap distribuito. Tuttavia, off-heap ha uno svantaggio di se/derializzazione e l'heap distribuito sulla mano aumenta i costi di manutenzione. Inoltre, nell'heap distribuito in realtà non si utilizza completamente la RAM (ad esempio 64 GB) che in questi giorni sta diventando comune come commodity.

Pertanto, per sfruttare appieno il potenziale della RAM, quali sono le buone soluzioni per il ridimensionamento verticale delle applicazioni Java?

+2

"applicazione in tempo reale Java" <= lol wut? Non dovresti davvero usare Java per un'applicazione in tempo reale. Semplicemente non è fatto per quello. –

+2

@stonedsquirrel: questa è una visione piuttosto ristretta del jvm. ci sono jvms che sono mirati alle applicazioni in tempo reale. – jtahlborn

+0

Suppongo che tu ti riferisca all'oracolo jvm, che è praticamente mirato allo "scopo generale". hai guardato jvms che sono specificamente progettati per la memoria enorme, come azul? – jtahlborn

risposta

5

Sto lavorando a una libreria di raccolte primitive denominata Banana. Banana si rivolge a quegli esatti problemi. Supporta LinkedLists, HashMaps e possibilmente altre strutture di dati presto senza il sovraccarico di mantenere N oggetti. in pratica - l'intera memoria può trovarsi all'interno di un array [] (o molti) int.

Anche se non l'ho ancora rilasciato ufficialmente, la maggior parte è ben testata e l'ho già eseguita con successo su server con 144 GB di RAM, mantenendo prestazioni veloci e costanti senza alcuna pausa GC.

Check out this benchmark hash-map per avere un'idea su come utilizzare Banana per archiviare i dati e come si scala in verticale.

https://github.com/omry/banana/wiki/Long-to-fixed-size-object-benchmark

Vedere la wiki per maggiori informazioni.

+0

Grazie per l'input. Lo attraverserà. È gratuito o ha qualche licenza per uso commerciale. – sky

+0

gratuito come in Banana (licenza BSD). –

+0

Fondamentalmente voglio vederlo usato e, si spera, ottenere un riconoscimento da parte degli utenti che questo è davvero fantastico come penso che sia, e forse anche una generale generosità open source come segnalazioni di bug e contributi al codice. –

0

Il tempo di raccolta dei dati inutili è una funzione del numero di oggetti attivi nell'heap. Ciò significa che se il tuo tasso di allocazione è molto alto ma il numero di oggetti live è sempre basso, puoi utilizzare tutta la RAM che vuoi senza avere pause significative.

Questa affermazione è particolarmente valida per il raccoglitore Troughput (-XX:+UseParallelOldGC).

Se si utilizza CMS, probabilmente si desidera verificarne la modalità incrementale (-XX:+CMSIncrementalMode). Attiverà cicli CMS più piccoli per pulire una frazione più piccola del tuo heap, sfruttando al contempo l'hardware e senza pause STW.

Se CMS non è un'opzione, è necessario dare un'occhiata a G1 (-XX:+UseG1GC), che è un nuovo Garbage Collector progettato per heap di grandi dimensioni. Il principio è: pulire solo diverse regioni dell'heap ad ogni ciclo, ma assicurati che queste regioni contengano molti oggetti morti (guadagni rapidi).

Spero che questo aiuti!

Fonti:

0

ho fatto qualche ricerca su scala dimensione heap di JVM. Puoi leggere maggiori dettagli here e here.

Conclusione principale: la pausa GC giovane ha due componenti costanti e variabili.

Il componente costante dipende dalle dimensioni del vecchio spazio e per 64GiB, mi aspetto che sia 80ms-120ms (dipende dall'hardware).

La componente variabile dipende dalla sopravvivenza degli oggetti nello spazio giovane (quindi passa dalla raccolta alla raccolta). È veramente specifico per l'applicazione, ma di solito è possibile ridurlo riducendo lo spazio giovane (al costo di pause più frequenti).

Nel tuo caso per 4 GiB di spazio giovane hai 500ms. Supponendo che il componente variabile sia 400ms, se riduci lo spazio giovane a 1 GiB dovresti avere pause di ~ 200 ms (ma 2 volte al secondo).

Un altro approccio consiste nell'utilizzare più core CPU, GC giovani paralleli extremely well.

0

I garbage collector G1 e Shenandoah (sperimentali) offrono una grande elasticità e sbloccano il ridimensionamento verticale per le applicazioni Java ottimizzando l'utilizzo della memoria in base al carico corrente. Ulteriori specifiche come funziona sono al l'articolo Minimize Java Memory Usage with the Right Garbage Collector

Java Elastic in Containers