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.
Grande. Darò questa prova domani mattina. – ReneS
Si prega di notare il formato corretto: -XX: + ParallelRefProcEnabled – ReneS
Help! I tempi sono ora intorno a 0,2 - 0,5 e sembrano essere prevedibili. Eccezionale! – ReneS