Domanda

Questo articolo qui suggerisce di utilizzare -XX: + UseParNewGC "Per abilitare un GC di nuova generazione parallelo con il GC simultaneo".

La mia confusione è che, al fine di abilitare GC sia parallelo che simultaneo, dovrei

  • usa -XX: + UseParNewGC o
  • usa entrambi -XX: + UseParNewGC e -XX: + UseConcMarkSweepGC ?

PS

Sto usando JVM 6.

È stato utile?

Soluzione

Dal momento che il documento che hai collegato era per una VM 1.4.2 è quello che suppongo tu stia usando (le JVM 5 e 6 si comportano diversamente).

Da http://java.sun.com/docs/hotspot/gc1. 4.2 /

  

se -XX: + UseConcMarkSweepGC è utilizzato su   la riga di comando quindi la bandiera   UseParNewGC è anche impostato su true se   altrimenti non è esplicitamente impostato su   riga di comando

Quindi la risposta è che devi solo usare -XX: + UseConcMarkSweepGC e abiliterà il collector simultaneo con il collector di nuova generazione parallelo.

Modifica: per Java 6, lo stesso flag (-XX: + UseConcMarkSweepGC) abilita il collector simultaneo. La scelta del collezionista che desideri dipende da alcune cose e dovresti testare diverse configurazioni. Ma ci sono alcune linee guida molto generali. Se si dispone di un singolo processore, macchina a thread singolo, è necessario utilizzare il raccoglitore seriale (impostazione predefinita per alcune configurazioni, può essere abilitato esplicitamente con -XX: + UseSerialGC). Per le macchine multiprocessore in cui il carico di lavoro è sostanzialmente associato alla CPU, utilizzare il raccoglitore parallelo. Questo è abilitato di default se si utilizza il flag -server, oppure è possibile abilitarlo esplicitamente con -XX: + UseParallelGC. Se preferisci mantenere le pause del GC più brevi a scapito dell'utilizzo di più tempo totale della CPU per GC e hai più di una CPU, puoi utilizzare il collector simultaneo (-XX: + UseConcMarkSweepGC). Si noti che il collector simultaneo tende a richiedere più RAM allocata alla JVM rispetto ai collector seriali o paralleli per un dato carico di lavoro perché può verificarsi una frammentazione della memoria.

Altri suggerimenti

tuning GC java / JDK 6: http: //www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html. Questo è di SUN (ora Oracle). Le cose complete.

Vedi anche
  http://kirk.blog-city.com/is_your_concurrent_collector_failing_you.htm
http://www.javaperformancetuning.com/

Questo post sul blog presenta una bella suddivisione dei diversi collezionisti e quali opzioni sono valide: http : //blogs.oracle.com/jonthecollector/entry/our_collectors

L'ottimizzazione GC Java è fondamentalmente un'arte oscura, ma nella mia applicazione (funziona con un heap di 50 + GB e 16 core fisici) il raccoglitore ConcMarkSweep ha provocato un aumento di velocità 3 volte rispetto all'impostazione predefinita del server e un aumento di velocità 2,2x ParallelOldGC.

Se non si condivide la macchina con altri processi (quindi i core inattivi vengono semplicemente sprecati) utilizzare ConcMarkSweepGC.

ParNew è il raccoglitore di nuova generazione predefinito quando si usa CMS. Devi solo specificare -XX: + UsaConcMarkSweepGC per usare CMS e ParNew verrà usato di default. Il CMS è un buon raccoglitore se evitare i nervosismi GC ha una priorità maggiore, ma se la velocità effettiva è più importante per esempio per un lavoro simile a un batch, il raccoglitore parallelo SUN predefinito fa un lavoro migliore.

Non è possibile abilitare due opzioni GC contemporaneamente. Vorrei suggerire di utilizzare CMS che è migliore di e GC di prossima generazione rispetto a UseParNewGC. e se usi Java 1.7 o versioni successive e la dimensione dell'heap è relativamente più grande (come > 4GB) considera l'utilizzo di G1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top