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 Strings, BigDecimals 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 Strings, BigDecimals, 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?

War es hilfreich?

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

scroll top