2012-02-21 8 views
10

La domanda è fondamentalmente contenuta nel titolo.La JVM forza la garbage collection quando raggiunge il limite -Xmx?

Supponiamo che tu abbia un'applicazione che ha raggiunto il limite JVM -Xmx. Quando l'applicazione richiede più memoria viene forzata la garbage collection? (nella HotSpot JVM)

Una seconda cosa strana che non riesco a spiegare è che attualmente ho un server di applicazioni che viene eseguito con -Xmx = 2048m, il comando "top" (su linux) riporta 2.7g per il suo processi.

Quindi come/quando un'applicazione può superare il suo -Xmx?

Grazie,

+1

'-Xmx = 2048' è 2048 byte. Immagino tu intenda '-Xmx = 2048m' Nota: puoi scrivere solo' -mx2g', che è la stessa cosa. –

+0

@PeterLawrey Grazie, sì, intendevo 2048m. Modificato la domanda. – Simeon

risposta

11

In realtà il GC normale viene attivato quando la generazione giovane è piena (non l'intero heap) e il GC principale viene attivato quando non vi è spazio nello spazio sopravvissuto, quindi alcuni oggetti devono essere migrati alla vecchia generazione.

+2

+1: di solito uno spazio completo è ciò che attiva un GC completo. Le raccolte secondarie di solito evitano che il superstite si riempia spostando gli oggetti nello spazio occupato prima che ciò accada. –

+2

'-Xmx' imposta solo la dimensione massima dell'heap. Questa è spesso la zona più grande, ma non l'unica area. Hai stack di thread, memoria diretta, librerie condivise, la JVM stessa ecc. –

1

Sì, se non si trova ancora la memoria si alzerà errore OutOfMemory. Lo capisco così.

3

Questo è in genere il caso, anche se il GC viene normalmente attivato molto prima, a seconda del Garbage Collector che si utilizza.

1

IIRC la garanzia è che un GC completo verrà eseguito prima che venga emesso un OutOfMemoryError. Poiché il superamento del limite di dimensione dell'heap deve comportare un tale errore, ciò implica che avrai sempre almeno una corsa GC completa al raggiungimento del limite.

3

Sì, la JVM chiamerà sicuramente il GC se raggiunge il limite di heap (e probabilmente molto prima). Se questo non aiuta, getterà OutOfMemoryError s.

Il motivo per cui si sta osservando un consumo di memoria di processo più grande è che l'opzione -Xmx limita solo lo spazio dell'heap Java (dove sono allocati gli oggetti Java). Vi sono inoltre altre regioni di memoria utilizzate dalla JVM: spazio per gli stack Thread, "PermGen" (dove sono memorizzate le classi e il loro codice), memoria "diretta" allocata tramite ByteBuffers, memoria allocata da librerie native, ecc. Per alcuni di queste regioni di memoria aggiuntive esistono altre opzioni di configurazione che consentono di limitarle, ad esempio -Xss, ma alcune sono addirittura fuori controllo della JVM.

0

Garbage Collection è una vasta area abbastanza, ma quello che dici è corretto per le collezioni (ci sono altri tipi)

Una cosa da considerare è che -Xmx imposta la dimensione heap massima, ma c'è anche an-Xms, che è la dimensione minima dell'heap. L'applicazione potrebbe iniziare con solo il minimo configurato. Quindi, se la memoria utilizzata raggiunge quella, attiverà una garbage collection completa E aumenterà la quantità di heap disponibile, dal minimo (-Xmx) fino a un valore inferiore o uguale al massimo (-Xmx). Questo può accadere più volte, fino al raggiungimento del massimo. Dopodiché, non può più aumentare l'heap ma le raccolte di dati inutili continueranno a verificarsi quando verrà raggiunto il massimo.

7

Il parametro Xmx specifica solo la dimensione dell'heap. Il processo Java richiede più memoria poiché l'heap è solo una parte del processo Java, suppongo che tu abbia anche altre cose che il processo java contiene come librerie native, perm gen e anche allocazioni native di memoria create dall'applicazione.

Ecco un bel articolo che descrive l'allocazione di memoria: http://www.ibm.com/developerworks/java/library/j-nativememory-linux/