2010-05-25 10 views
12

Ich sehe die folgenden Symptome auf eine GC-Log-Datei der Anwendung mit den Concurrent Mark-Sweep Sammlern:JVM CMS Müllprobleme Sammeln

4031.248: [CMS-concurrent-preclean-start] 
4031.250: [CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
4031.250: [CMS-concurrent-abortable-preclean-start] 
CMS: abort preclean due to time 4036.346: [CMS-concurrent-abortable-preclean: 0.159/5.096 secs] [Times: user=0.00 sys=0.01, real=5.09 secs] 
4036.346: [GC[YG occupancy: 55964 K (118016 K)]4036.347: [Rescan (parallel) , 0.0641200 secs]4036.411: [weak refs processing, 0.0001300 secs]4036.411: [class unloading, 0.0041590 secs]4036.415: [scrub symbol & string tables, 0.0053220 secs] [1 CMS-remark: 16015K(393216K)] 71979K(511232K), 0.0746640 secs] [Times: user=0.08 sys=0.00, real=0.08 secs] 

Der preclean Prozess hält kontinuierlich abgebrochen wird. Ich habe versucht, CMSMaxAbortablePrecleanTime auf 15 Sekunden, von der Standardeinstellung 5, anzupassen, aber das hat nicht geholfen. Die aktuellen JVM-Optionen sind wie folgt ...

Djava.awt.headless=true 
-Xms512m 
-Xmx512m 
-Xmn128m 
-XX:MaxPermSize=128m 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:BiasedLockingStartupDelay=0 
-XX:+DoEscapeAnalysis 
-XX:+UseBiasedLocking 
-XX:+EliminateLocks 
-XX:+CMSParallelRemarkEnabled 
-verbose:gc 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDetails 
-XX:+PrintHeapAtGC 
-Xloggc:gc.log 
-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenPrecleaningEnabled 
-XX:CMSInitiatingOccupancyFraction=50 
-XX:ReservedCodeCacheSize=64m 
-Dnetworkaddress.cache.ttl=30 
-Xss128k 

Es scheint die gleichzeitige abbrechbare-Vorreinigung wird nie eine Chance zu laufen. Ich lese durch https://blogs.oracle.com/jonthecollector/entry/did_you_know, die einen Vorschlag zum Aktivieren CMSScavengeBeforeRemark hatte, aber die Nebenwirkungen der Pause schien nicht ideal. Könnte jemand Vorschläge machen?

Auch war ich frage mich, ob jemand eine gute Referenz für grokking die CMS-GC-Logs hatte, insbesondere dieser Zeile:

[1 CMS-remark: 16015K(393216K)] 71979K(511232K), 0.0746640 secs] 

Nicht auf welche Speicherbereiche klar diese Zahlen zu beziehen. bearbeiten einen Link zu diesem http://www.sun.com/bigadmin/content/submitted/cms_gc_logs.jsp

gefunden
+0

Das cms-Tag wird verwendet, um sich auf Content-Management-Systeme zu beziehen, nicht auf gleichzeitige GCs für Markierungen und Sweeps. Ich werde es entfernen. –

+0

Whoops tut mir leid, danke – jlintz

+0

Das Einleiten von CMS bei 50% scheint irgendwie niedrig zu sein: -XX: CMSInitiatingOccupancyFraction = 50 Vielleicht wird es (oder unter Verwendung der Standardeinstellungen als 'Antispam' schlägt) anders verhalten. Auch haben meine Protokolle in der Regel ParNew laufen sie vor, während und nach CMS. Läuft ParNew? –

Antwort

3

[Zeiten: user = 0,00 sys = 0,01, real = 5,09 sec]

würde ich untersuchen versuchen, warum CMS-concurrent-abortable-preclean-start nicht weder Benutzer erhalten noch sys CPU-Zeit in 5 Sekunden.

Mein Vorschlag ist, ausgehend von einem ‚sauberen‘ JVM CMS Start Flags wie

-Djava.awt.headless=true 
-Xms512m 
-Xmx512m 
-Xmn128m 
-Xss128k 
-XX:MaxPermSize=128m 
-XX:+UseConcMarkSweepGC 
-XX:+HeapDumpOnOutOfMemoryError 
-Xloggc:gc.log 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDetails 
-XX:+PrintHeapAtGC 

dann prüfen, ob das Problem und halten wiedergibt einen Parameter zu einem Zeitpunkt, zwicken.

3

Wie bereits erwähnt, wäre der erste Schritt, CMSInitiatingOccupancyFraction zu erhöhen.

Als zweiten Schritt würde ich die Flagge -XX:-PrintTenuringDistribution verwenden und sicherstellen, dass es keine vorzeitige Beförderung von der jungen Generation zu der alten gibt. Dies würde zu alt-zu-jung Referenzen führen, die zu einer längeren abtreibbaren Vorreinigungs-Phase führen könnten. Wenn es solch eine vorzeitige Promotion gibt, versuchen Sie, das Verhältnis zwischen den Eden- und den Survior-Räumen anzupassen.

2

ist es eine gute Erklärung here über dieses Phänomen:

Zitat:

Also, wenn die Systemlast Licht ist (was bedeutet, dass es keine kleineren gc sein), wird Vorreinigung immer time out und volle gc wird immer fehlschlagen. CPU ist Abfall.

Es wird nicht fehlschlagen. Es wird weniger parallel sein (d. H. Weniger effizient und würde für weniger Arbeit eine längere Pausenzeit haben).

Also alles in allem: dies scheint normalen Betrieb zu sein - der Faden nur für wartet eine kleine GC für 5 Sekunden passieren, aber es ist kein großes Problem, wenn dies nicht der Fall: die JVM eine andere wählt (weniger effiziente) Strategie, um mit dem GC fortzufahren.