2010-11-04 3 views
10

Attualmente sto affrontando il problema che la mia applicazione mostra sporadicamente tempi lunghi del GC, ma tutti questi sono causati solo da un'elaborazione di riferimento debole. Quindi il tempo di interruzione del filetto è sempre vicino al tempo di elaborazione del ref debole. Tutti gli altri cicli GC sono compresi tra 0,0001 e 0,200 secondi.Come posso ridurre il tempo di elaborazione del ref debole durante il GC?

Dal gc.log (riformattato):

10388.186: [GC[YG occupancy: 206547 K (306688 K)]10388.186: [Rescan (parallel) , 
0.1095860 secs]10388.295: [weak refs processing, 2.0799570 secs] 
[1 CMS-remark: 2973838K(3853568K)] 3180386K(4160256K), 2.1899230 secs] 
[Times: user=2.51 sys=0.00, real=2.18 secs] 
Total time for which application threads were stopped: 2.1906890 seconds 

Attualmente ho queste impostazioni in atto. Ho provato le impostazioni più semplici, ma nessun cambiamento.

-Xms4g 
-Xmx4g 
-XX:NewSize=128m 
-XX:+UseConcMarkSweepGC 
-XX:+CMSIncrementalMode 
-XX:MaxGCPauseMillis=50 
-XX:CMSInitiatingOccupancyFraction=50 
-XX:ParallelGCThreads=16 
-XX:+DisableExplicitGC 

Se si visualizza NewSize, si ottengono lunghi cicli di GC normali. La macchina ha 8 core e non brucia molta CPU per l'applicazione. Ho cercato di eseguire il GC vecchio gen presto e contemporaneamente.

E sì, non riesco a sbarazzarmi del debole utilizzo ref, perché questo fa parte di una libreria di terze parti.

risposta

7

Ho trovato this message nella mailing list "hotspot-gc-use".

In breve, provare l'interruttore -XX:+ParallelRefProcEnabled.


UPDATE

ho trovato una spiegazione migliore in Jon Masamitsu di Weblog:

6) elaborazione parallela riferimento nella bassa collettore pausa.

Per un'applicazione che utilizza estensivamente gli oggetti Reference, il GC lavora per elaborare gli oggetti di riferimento che possono essere visibili. Non è necessariamente peggio nel raccoglitore di bassa pausa che negli altri raccoglie, ma fa più male (perché stiamo cercando di mantenere basse le pause). L'elaborazione di riferimento parallela è disponibile per il raccoglitore a bassa pausa ma non è attiva per impostazione predefinita. A meno che non ci siano tonnellate di oggetti di riferimento, l'elaborazione di riferimento in serie è generalmente più veloce. Accendilo con la bandiera -XX:+ParallelRefProcEnabled se usi ampiamente gli oggetti Reference (la maggior parte delle applicazioni non lo fa).

+0

Grande. Darò questa prova domani mattina. – ReneS

+0

Si prega di notare il formato corretto: -XX: + ParallelRefProcEnabled – ReneS

+0

Help! I tempi sono ora intorno a 0,2 - 0,5 e sembrano essere prevedibili. Eccezionale! – ReneS