Domanda

Le JVM recenti hanno molti parametri XX per la garbage collection (vedi qui per esempio), ma quali sono le opzioni che possono rendere davvero migliori le applicazioni Swing sul lato client?

Dovrei notare che una delle cose che mi infastidisce davvero nelle applicazioni java sul lato client è il grande ritardo nella raccolta dei rifiuti stop-the-world. In Intelli-J IDEA l'ho visto passare tre minuti o più.

EDIT: grazie per tutte le risposte. Solo per riferire ho messo il Garbage Collector CMS per IDEA (che è un buon riferimento comune al tipo di applicazione con cui la maggior parte di coloro che leggono questa domanda hanno familiarità) usando l'impostazione suggerita da qui . Ho anche impostato -XX: + StringCache per vedere se avrebbe ridotto i requisiti di memoria.

In generale, l'osservazione è che le prestazioni della corsa regolare non sono degradate al punto in cui si può notare osservandola. La riduzione della memoria è enorme usando l'opzione String Cache, tuttavia il metodo CMS non è completo e finisce per richiedere un arresto del ciclo di raccolta dei rifiuti del mondo (fino all'attesa di tre minuti) per cancellare la memoria ( 400 MB in una corsa).

Tuttavia, dato il ridotto ingombro di memoria, potrei essere in grado di mettere solo una quantità massima di memoria più piccola che manterrà le dimensioni più ridotte delle raccolte mondiali.

IDEA 8.1.4 viene fornito con JDK 1.6.0_12, quindi non ho ancora testato G1. Inoltre, la mia macchina ha solo 2 core, quindi un approccio G1 non sarà davvero massimizzato. È ora di colpire il boss per una macchina migliore;).

È stato utile?

Soluzione

Non esiste una risposta unica a questa domanda, dipende fortemente da cosa sta facendo l'applicazione e da come gestisce i suoi oggetti. Forse dai un'occhiata a Come funziona la garbage collection e Raccoglitori di rifiuti paralleli e simultanei per comprendere le varie opzioni.

Quindi, controlla HotSpot Java SE 6 [tm] Immondizia macchina virtuale Raccolta Tuning che espande i concetti e le tecniche di ottimizzazione GC per Java SE 6 che sono stati introdotti nel Ottimizzazione di Garbage Collection con il documento Java Virtual Machine 5.0 .

Se si desidera mantenere brevi le pause della garbage collection, è probabile che il raccoglitore simultaneo sia nella direzione giusta in quanto esegue la maggior parte del suo lavoro contemporaneamente (ovvero, mentre l'applicazione è ancora in esecuzione). Ma trovare la migliore configurazione richiederà la profilazione (prendere in considerazione la misurazione della produttività del GC, il tempo di pausa massimo e medio, la frequenza dei GC completi e anche la loro durata).

(EDIT: dopo aver letto un commento dall'OP, penso che leggendo I miei consigli sull'heap JVM accordatura, tieni le dita lontane dalle manopole! dal guru delle prestazioni Kirk Pepperdine sarebbe una buona idea.)

Altri suggerimenti

L'ottimizzazione della garbage collection è più di un'arte che di scienza, e dipende davvero dalla tua applicazione e dal suo utilizzo. Se le strategie standard stop-the-world ti danno fastidio, perché non convertirti in CMS (mark e sweep simultanei) o nel nuovo raccoglitore G1?

Il modo migliore è modificare i parametri e collegare un profiler per esaminare il comportamento dell'applicazione.

Questo è abbastanza automatico e funziona per noi:

-server -Xss4096k -Xms12G -Xmx12G -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+PrintGCTaskTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Xloggc:gc.log

Non è presente " migliore " opzione (se ci fosse, qualcuno la userebbe, giusto?) ma forse un'opzione che aiuta nel tuo caso. Ma ecco alcuni suggerimenti:

  • Utilizza l'ultima VM. Il codice GC è migliorato con ogni versione.
  • Utilizza il client jvm.dll (disponibile sinve Java 1.5 in jre / bin / client / ). Questo dovrebbe essere il valore predefinito.
  • Allocare e liberare oggetti in Java è economico. È costoso tenerli in giro.

Se vuoi prestazioni migliori, dai meno lavoro al garbage collector. Prendi in considerazione l'utilizzo di un pool di oggetti anziché crearli e scaricarli costantemente e assicurati di aver bisogno di ogni oggetto che crei.

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