Verwenden PermGen Raum oder Roll-my-own intern Methode?
-
30-09-2019 - |
Frage
Ich bin einen Codec zu verarbeiten Schreiben von Nachrichten über TCP gesendet mit einem maßgeschneiderten Wire-Protokoll. Während des Dekodierungsprozesses erstelle ich eine Reihe von String
s, BigDecimal
s und Terminen. Die Client-Server-Zugriffsmuster bedeuten, dass es üblich ist, dass der Client eine Anforderung zur Ausgabe und dann dekodieren Tausender von Antwortnachrichten, die Ergebnisse in einer großen Anzahl von doppelten String
s, BigDecimal
s, etc.
Deshalb habe ich eine InternPool<T>
Klasse erstellt mich intern so dass jede Klasse von Objekten. Intern verwendet der Pool eine WeakHashMap<T, WeakReference<T>>
. Zum Beispiel:
InternPool<BigDecimal> pool = new InternPool<BigDecimal>();
...
// Read BigDecimal from in buffer and then intern.
BigDecimal quantity = pool.intern(readBigDecimal(in));
Meine Frage: Ich verwende InternPool
für BigDecimal
aber sollte ich benutze es auch für String
statt String
des intern()
Methode, die ich Verwendungen PermGen Raum glauben? Was ist der Vorteil von PermGen Raum mit?
Lösung
Es ist wahrscheinlich, dass die String.intern()
Becken JVM wird schneller sein. AFAIK ist es in nativen Code implementiert, so dass es sollte schneller sein und weniger Platz benutzt als ein Pool mit WeakHashMap
und WeakReference
umgesetzt. Sie müßten einig sorgfältiges Benchmarking zu tun, dies zu bestätigen.
Allerdings, wenn Sie große Anzahl von haben langlebige doppelte Objekte, bezweifle ich, dass (entweder in PermGen oder mit dem eigenen Pool) interning wird viel Unterschied machen. Und wenn das Verhältnis der einzigartigen Objekte zu duplizieren zu niedrig ist, Internierung, dann wird nur die Anzahl der Live-Objekte erhöhen (was die GC länger dauern) und reduzieren die Leistung aufgrund der Gemeinkosten der Internierung, und so weiter. Also habe ich auch die "intern" versus "ohne intern" Benchmarking plädiere annähert.
Andere Tipps
Wenn Sie bereits eine solche InternPool
Klasse haben, es denke, es ist besser zu bedienen, dass als eine andere interning Methode für Streicher zu wählen. Vor allem, da String.intern()
scheint geben eine viel stärkere Garantie als Sie tatsächlich benötigen. Ihr Ziel ist die Speichernutzung zu reduzieren, so perfekt für die gesamte Lebensdauer der JVM Internierung ist nicht wirklich notwendig ist.
Außerdem würde ich die Google Sammlungen