2013-10-07 3 views
6

Meine Java-App unterhält einen internen Cache, der bis zu 10 Gigs wachsen konnte. Ablaufrichtlinie ist auf 30 Minuten festgelegt oder wenn Speicherschwelle erreicht ist (ich verwende lokalen ehcache). Es ist offensichtlich, dass nach 30 Minuten alle zwischengespeicherten Objekte in dem alten Gen sind und es einen vollständigen GC erfordern wird, um sie zu sammeln. Momentan könnte die Stop-World Pause 6 Sekunden erreichen und ich möchte sie reduzieren.Wie Java gc für langlebige Objekte zu optimieren

Durchschnittliche Objektgröße ist 500k, könnte aber bis zu 1 Megabyte gehen, also sprechen wir über 10000-20000 zwischengespeicherte Objekte (tatsächlich Byte-Arrays).

Was ist die beste Strategie für die GC-Optimierung? Ich weiß, dass ich mich aus dem Staub machen kann, aber es ist eine Art letzte Lösung.

Vielen Dank!

+0

Schreiben Sie Ihren eigenen Cache-Code gegen ein schwaches referenzbasiertes Schema. –

+0

Was meinst du? Wenn es in Heap lebt, unterliegt es immer noch einem Full GC. – Alex

+0

Hängt davon ab, was genau du tust. Sie können die Hauptstruktur wiederverwenden und sogar Bytearrays wiederverwenden, anstatt neue zu erstellen. –

Antwort

2

Ich arbeite routinemäßig mit Caching-Services mit 10-30 GiB Daten in JVM-Heap. Der Concurent Mark Sweep (GC) -Algorithmus kann diese Fälle ziemlich gut verarbeiten und hält die Stop-the-World-Maximalpause um 100 ms (die absoluten Zahlen hängen jedoch von der Hardware ab).

Sie finden GC Tuning check list für Caching-Anwendungen und Heap-Sizing in meinem Blog.

Here Sie können mehr über Concurent Mark Sweep-Algorithmus selbst finden.

3

10 GB Cache ist nicht etwas, was Sie im Heap tun sollten. Verwenden Sie zum Zwischenspeichern ByteBuffers. Objekterstellung sollte nicht so teuer sein. Auf diese Weise ist kein GC beteiligt und Sie können alles selbst verwalten.

Wenn Sie beispielsweise einen Seitencache in einem Java-Datenbankverwaltungssystem implementieren, würden Sie keine Objekte dafür erstellen, sondern Bytepuffer oder verwaltete Bytepuffer oder die besten direkten Bytepuffer. Sie können mehr über diese drei here lernen.

Wenn Sie mehr als eine Million Objekte auf einmal behandeln, wird der GC-Zeitanteil steigen. Ich sah Situationen, in denen wir eine riesige Anzahl von Knoten für die Datenverarbeitung verwalteten und es war sehr langsam. Wir wechselten dann zu einem direkten Byte-Puffer-Schema und verwendeten sogar einige zusätzliche Techniken, in die wir mehr Daten einfügen konnten (Objekte kosteten mindestens 24 Bytes) und hörten auf, über Objekte an erster Stelle nachzudenken. Am Ende haben wir Daten und nicht Objekte behandelt. Dies hat die Leistung um ein Vielfaches erhöht und wir können viel mehr Daten verarbeiten, als wir erwartet haben.

Danach haben wir festgestellt, dass alles zu einer Datenbank passt und das war der Punkt, an dem wir alles auskratzten.

So überprüfen Sie, was direkte Puffer für Sie tun können.