2012-03-14 18 views
9

Sono confuso su due parametri che possono controllare quando i calci collettore CMS in:Garbage collector CMS: quando viene eseguito?

MaxHeapFreeRatio (70% di default)

CMSInitiatingOccupancyFraction (oltre il 90% di default)

Che cosa significa ciascuno di questi i parametri significano, esattamente? Quando inizia il collettore (fase di marcatura) e raccoglie (fase di spazzamento)?

risposta

11

CMSInitiatingOccupancyFraction decide quando viene attivato il CMS (per fare in modo che questa opzione sia efficace, è necessario anche impostare XX: + UseCMSInitiatingOccupancyOnly). MaxHeapFreeRatio è un'opzione per dimensionare gli spazi generazionali.

Vedi per esempio ...

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

La raccolta simultanea in genere non può essere accelerato, ma può essere avviato in precedenza. Una raccolta simultanea inizia a girare quando la percentuale di spazio allocato nella vecchia generazione supera una soglia. Questa soglia viene calcolata in base all'esperienza generale con il collector concorrente. Se si verificano raccolte complete, potrebbe essere necessario avviare le raccolte simultanee in precedenza. Il flag della riga di comando CMSInitiatingOccupancyFraction può essere utilizzato per impostare il livello al quale viene avviata la raccolta. Il suo valore predefinito è circa il 68%. La riga di comando per regolare il valore è XX: CMSInitiatingOccupancyFraction =

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

Per default, la macchina virtuale cresce o riduce mucchio ad ogni raccolta per cercare di mantenere la proporzione dello spazio libero di vivere a oggetti ogni collezione all'interno di un intervallo specifico. Questo intervallo di destinazione è impostato come percentuale dai parametri -XX: MinHeapFreeRatio = e -XX: MaxHeapFreeRatio =, e la dimensione totale è limitata di -Xms e sopra di -Xmx. I parametri di default per il sistema operativo Solaris a 32 bit (Edizione per piattaforma SPARC) sono mostrati in questa tabella:

.. o ..

http://www.petefreitag.com/articles/gctuning/

XX: MaxHeapFreeRatio - quando la percentuale di libera lo spazio di una generazione ha superato questo valore e la generazione si ridurrà per soddisfare questo valore. L'impostazione predefinita è 70

MODIFICA: Ho eseguito alcune simulazioni con un programma di test che crea casualmente mappe di array di byte e le copia in giro. Ho notato che a) il valore della frazione non è stato rispettato - in particolare con un valore conservativo (per esempio 50) lo stadio iniziale del CMS è stato calciato molto oltre il 50% di occupazione, tipicamente attorno al 70-80% eb) tuttavia valori di frazione più bassi hanno reso il CMS fase iniziale accadere in precedenza (programma utilizzato -Xmx1536m -Xmx1536m XX: newSize = 512m -XX: + UseConcMarkSweepGc + registrazione GC e due parametri di prova)

ho anche trovato un vecchio bug report riguardo a questa: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

+3

'CMSInitiatingOccupancyFraction' viene utilizzato solo per la prima raccolta a meno che non sia impostato' -XX: + UseCMSInitiatingOccupancyOnly'. Se non si imposta quest'ultima opzione, dopo la prima, vengono utilizzate le normali euristiche (basate sulle statistiche di allocazione raccolte durante il runtime) per determinare quando viene avviato CMS. – Matt

+0

Grazie Matt, l'ho aggiunto. – moodywoody

+0

Da qualche osservazione sembra che dopo poche ore notturne di utilizzo ridotto non ha calciato fino a raggiungere oltre il 90% (cioè 'CMSInitiatingOccupancy'.) Tuttavia, durante il giorno non sembra aspettare tanto tempo ma raccoglie prima. Questo sembra corrispondere a ciò che @Matt ha detto, ma in questo caso vorrei sapere quali sono "le solite euristiche" e per quanto tempo un tempo di pace lo fa andare in sospeso e attendere la soglia> 90%. –

Problemi correlati