2013-03-29 10 views
6

Ich führe gerade eine Anwendung aus, die eine maximale Heap-Größe von 16 GB erfordert.Lange GC-Pausen in Anwendung

Derzeit verwende ich die folgenden Flags, um Garbage Collection zu behandeln.

-XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=50, -XX\:+DisableExplicitGC, -XX\:+PrintGCDateStamps, -XX\:+PrintGCDetails, -Xloggc\:/home/user/logs/gc.log 

Allerdings habe ich festgestellt, dass die Anwendung abstürzt für einige Sekunden während einiger Garbage Collection, und dann weitermacht - Das ist völlig inakzeptabel, da es ein Spiel-Server ist.

Ein Anfall von meiner Müllabfuhr Protokolle können here gefunden werden.

Alle Ratschläge, was ich ändern sollte, um diese langen Pausen zu reduzieren, würden sehr geschätzt werden.

+4

Ich glaube, das ist einer der Gründe ist, warum viele Menschen C bevorzugen ++ über Java für Echtzeit-Spiele . Aber nimm * mein * Wort nicht dafür ... – Mysticial

+0

Kannst du bestimmte Zeilen mit langen gc-Pausen angeben? Anstatt zu erwarten, dass die Leser die Protokolldatei für die Zeilen – noahlz

+0

durchforsten, bevorzuge ich den Off-Heap-Speicher für etwas über 1 GB. Off-Heap-Speicher ist schwieriger zu codieren, hat jedoch nur geringen Einfluss auf GC-Pausenzeiten. –

Antwort

4

Alle Ratschläge, was ich ändern sollte, um diese langen Pausen zu reduzieren, würden sehr geschätzt werden.

Die Chancen sind, dass der CMS GC nicht mit der Menge an Müll, die Ihr System erzeugt, Schritt halten kann. Aber die Arbeit, die der GC durchführen muss, ist eigentlich näher bezogen auf die Menge an NON-Müll, die Ihr System behält.

So ...

  • Versuchen Sie, die aktuelle Speichernutzung der Anwendung zu verringern; z.B. indem du nicht so viel Zeug im Cache speicherst oder die Größe deiner "Welt" reduzierst.
  • Versuchen Sie, die Rate zu reduzieren, mit der Ihre Anwendung Müll generiert.
  • Führen Sie ein Upgrade auf eine Maschine mit mehreren Kernen durch, sodass bei Bedarf weitere Kerne zum Ausführen der parallelen GC-Threads verfügbar sind.

Um Mysticial:

Ja im Nachhinein, könnte es den Server in C++ zu implementieren besser gewesen sein. Wir wissen jedoch nichts über "das Spiel". Wenn es sich um ein kompliziertes Weltmodell mit komplizierten heterogenen Datenstrukturen handelt, dann könnte das Implementieren in C++ bedeuten, dass Sie das "GC-Pause" -Problem durch das Problem ersetzen, dass der Server aufgrund von Problemen mit der Art der Verwaltung stürzt seine Datenstrukturen.

+0

Ich wollte Java nicht verprügeln. C++ und Java sind nur verschiedene Werkzeuge für verschiedene Dinge. – Mysticial

+0

Das Spiel, das der Server läuft, ist "Minecraft", wenn das überhaupt hilft. – Gontroller

+3

Ah ... also im Grunde ist deine Frage, wie man Minecraft stimmt. Eigentlich kein Programmierproblem. Du wirst bessere Antworten dafür auf den Minecraft-Formularen bekommen, denke ich. –

0

Welche Version von Java verwenden Sie? http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html Um besser zu versuchen, die Verwendung von Instanzvariablen in einer Klasse zu minimieren.Es wäre besser, auf lokale Variablen als Instanz Variablen durchzuführen.Es hilft bei der Erlangung der Leistung und sicher vor Synchronisationsproblem.Im Ende der Operation vor dem Beenden des Programms Setzen Sie die verwendeten Variablen immer zurück, wenn Sie Instanzvariablen verwenden, und setzen Sie sie erneut, wenn dies erforderlich ist. Es hilft mehr bei der Verbesserung der Leistung. Neben der Version von Java ist eine gute Garbage-Collection-Richtlinie implementiert. Es wäre besser, zu einer neuen Version zu wechseln, wenn das floppelbar ist. Sie können auch die Pausenzeit des Garbage Collectors über VisualVm überwachen, und Sie können mehr Informationen erhalten, wenn mehr Garbage Collection durchgeführt wird.

1

Ich bin kein Experte für Java-Speicherbereinigung, aber es sieht so aus, als ob Sie mit dem Concurrent Collector (dem UseConcMarkSweepGC-Flag) das Richtige tun, wenn der Server mehrere Prozessoren hat. Befolgen Sie die Vorschläge zur Fehlerbehebung unter http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms.Wenn Sie bereits haben, lassen Sie uns wissen, was passiert ist, als Sie sie ausprobiert haben.

2

Mit Blick auf Ihre Protokolle sehe ich keine langen Pausen. Aber junge GC ist sehr häufig. Die Promotion-Rate ist jedoch sehr niedrig (der meiste Müll wird von der jungen GC geklärt, so wie es sein sollte). Zur gleichen Zeit ist Ihre alte Raumnutzung gering.

BTW reden wir über minecraft Server?

Um die Häufigkeit von jungen GC zu verringern, sollten Sie seine Größe erhöhen. Ich würde vorschlagen, mit Beginn -XX:NewSize=8G -XX:MaxNewSize=8G

Für solch großen jungen Raum, sollten Sie auch Überlebende Raumgröße -XX:SurvivorRatio=512

GC-Tuning ist ein Weg von Versuch und Fehlern reduzieren, so dass Sie einige mehr Iterationen und Zwicken müssen.

Sie können einige nützliche Artikel in mu Blog finden