2016-06-03 7 views
2

Ich habe eine Web-Service-Anwendung, die Hunderte von Anfragen pro Minute empfangen kann. Mit dem Standard-GC stoppt die VM in Java 8 die Welt alle paar Minuten, daher kommt es vor, dass einige der Anforderungen extrem langsam sind.GC in Java8 und stoppen Sie die Welt in Web-Services

änderte ich den GC auf G1 wie folgt:

-XX:+UseG1GC 

Jedoch habe ich hier gelesen, dass G1 ist langsamer:

http://www.optaplanner.org/blog/2015/07/31/WhatIsTheFastestGarbageCollectorInJava8.html

Gibt es eine Möglichkeit, die Standard-Java-8 Kollektor Anhalten zu verwenden die Welt häufiger, also weniger traumatische Auswirkungen auf einige der Anfragen? Welche andere Lösung gibt es da draußen?

+0

Wie groß ist Ihre maximale Heapgröße? –

+0

G1 ist langsamer macht keinen Sinn für mich, da es vom Kontext abhängt, in der Tat G1 für große Heap Größe bis 32 Go verwendet werden soll, testet es mit 2 Go nur nicht wirklich Sinn –

+0

Lesen Sie die [Oracle GC Tuning-Leitfaden] (https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html). Alles davon. – the8472

Antwort

1

Ihre Frage impliziert, dass Sie weit davon entfernt sind, nicht-naive Ideen über "Garbage Collector" Setup zu haben.

Alle letzten Müllsammler haben unterschiedliche Eigenschaften; und sie haben eine Menge Einstellungen, die verwendet werden können, um ihr Verhalten zu ändern, um bestimmte Ziele zu erreichen.

Bedeutung: Es spielt keine Rolle, ob G1 langsamer ist. Wenn Sie es so einstellen können, dass es Ihrer Anwendung besser als Ihre aktuelle Einstellung dient, wäre es die Wahl, die Sie treffen sollten.

Lange Rede, kurzer Sinn: Sie scheinen an einem Punkt zu sein, an dem (Garbage Collection) die Leistung Ihrer Anwendung ein echtes Problem ist. Dann gibt es nur eines zu tun: fang an zu messen. Verstehen Sie, was Ihr Code macht; wie es das macht; und wie das mit JIT und GC "interagiert". Dann identifizieren Sie Ziele, die Sie optimieren möchten; und fange an, Experimente zu machen (bei denen du im Idealfall nur eine einzige Konfigurationsänderung änderst), um JIT/GC-Einstellungen zu finden, die dich auf dieses Ziel hin bewegen.

Beispiel: vielleicht wäre es genug, G1 zu verwenden; und geben Sie ein "Pausenziel", das für Sie arbeitet. Aber vielleicht müssen Sie "GC-Tracing" für Ihre JVM aktivieren; um zu verstehen, wie viel Arbeit der GC für Ihre Anwendung zu leisten hat; und vielleicht wäre die Antwort, etwas in deinem Code zu reparieren ... um einfach weniger Müll zu erzeugen.

Wie in: es ist nicht viel Sinn, den GC zu tunen; wenn Ihre Anwendung jede Minute (vermeidbare) GBs "Müll" erzeugt.