2013-04-01 14 views
5

Ho un'applicazione java che utilizza tutta la CPU che può e, con essa, molta memoria (fino a 80Gb).Dare più tempo CPU a GC in java?

Sto ottimizzando il GC per quell'app e voglio dire alla JVM di usare una data percentuale di tempo (60%) per il GC, altrimenti la quantità di tempo che la macchina non è in GC sta elaborando e allocando di più memoria.

ho voluto confermare che il parametro -XX:CMSIncrementalDutyCycle=60 è la cosa che sto cercando e se ci sono altri parametri per dare più potere al GC (ho già visto la CMSIncrementalPacing e CMSIncrementalDutyCycleMin)

Grazie un mucchio!

+1

"Volevo confermare che il XX: CMSIncrementalDutyCycle = 60 parametro è il thig che sto cercando" - provare, abilitare la registrazione GC e vedere? Inoltre, per curiosità: cosa stai facendo che crea abbastanza rifiuti per il 60% di tempo trascorso in GC per non essere un gran bel lotto? – millimoose

risposta

1

non è possibile impostare a soffitto per l'utilizzo della CPU durante le raccolte GC.

Il CMSIncrementalDutyCycle è usato per impostare il tempo tra collezioni minori (vedi [1]), in modo da poter controllare la frequenza viene eseguito il GC e quindi, indirettamente, l'utilizzo della CPU. Ma non ci sono parametri che ti permettano di controllare direttamente l'utilizzo della CPU.

+1

Infatti il ​​CMSIncrementalDutyCycle fornisce solo un controllo indiretto di esso. Ahimè, il mio problema è stato risolto riducendo drasticamente la giovane generazione. Grazie a tutti. – mors

1

ho voluto confermare che il XX: CMSIncrementalDutyCycle = 60 parametro è il thig che sto cercando e se ci sono altri parametri a dare più potere al GC (ho già visto il CMSIncrementalPacing e CMSIncrementalDutyCycleMin)

No, si sbaglia. Questo flag non controllerà quale percentuale della CPU disponibile verrà assegnata al GC della JVM. La documentazione indica:

-XX:CMSIncrementalDutyCycle=<N> default: 50 

Questa è la percentuale (0-100) di tra minori collezioni che il collettore concomitante è consentita l'esecuzione. Se CMSIncrementalPacing è abilitato , questo è solo il valore iniziale.

Quindi, supponendo che si sta utilizzando il collettore CMS (-XX:+UseConcMarkSweepGC), poi la bandiera sopra controlla la percentuale di tempo il CMS è autorizzato ad eseguire tra le collezioni GC minori.

Non c'è nessun flag che consente di controllare direttamente la quantità di tempo che il thread GC esegue.

+0

ok. Quindi, cosa succede tra le raccolte minori oltre alle esecuzioni di GC? – mors

+0

l'applicazione viene eseguita, i metodi di compilazione jit, ecc. –

+0

Si dovrebbe anche assumere che -XX: + CMSIncrementalMode sia abilitato, che non è una buona idea per la casella "grande" –

1

Innanzitutto, CMSIncreamentalDutyCycle influisce su CMS algoright incrementale (che deve essere abilitato per -XX:+CMSIncrementalMode). La modalità incrementale fa male alla tua attività in qualsiasi modo.

In secondo luogo, è possibile limitare il numero di core CPU consumati dalle attività del GC.

  • -XX:ParallelGCThreads=N imposta il numero di nucleo per le fasi di Stop-the-World
  • -XX:ConcGCThreads=N set numero di base per attività simultanee (solo per i CMS)

Potete trovare ulteriori opzioni relative GC here.

Problemi correlati