Ich schreibe einen Codec, um Nachrichten zu verarbeiten, die über TCP mit einem maßgeschneiderten Kabelprotokoll gesendet werden. Während des Dekodierungsprozesses erstelle ich eine Anzahl von String
s, BigDecimal
s und Daten. Die Client-Server-Zugriffsmuster bedeuten, dass es üblich ist, dass der Client eine Anforderung zur Ausgabe und dann Tausende von Antwortnachrichten, die in einer großen Anzahl von DuplikatString
s, BigDecimal
s usw.Verwenden Sie PermGen Space oder Roll-My-Own intern Methode?
Daher ergeben dekodieren I habe eine InternPool<T>
Klasse erstellt, die es mir erlaubt, jede Klasse von Objekten zu internieren. 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 soll ich benutze es auch für String
stattString
‚s intern()
Methode, die ich glaube, verwendet PermGen Raum? Was ist der Vorteil der Verwendung von PermGen-Speicherplatz?
@kts: Wenn ich Byte [] zu BigDecimal zuordnen würde, dann ist das Problem, dass Byte [] nicht referenziert wird, sobald der interne Pool das BigDecimal erstellt/zurückgegeben hat. Unter der Annahme, dass das Byte [] der Schlüssel in der zugrundeliegenden WeakHashMap ist, würde dies dazu führen, dass der Eintrag entfernt wird, obwohl das entsprechende BigDecimal verwendet wird. – Adamski
Ist 'WeakReference' dafür geeignet, oder sollten Sie lieber eine' SoftReference' verwenden? Der GC verhält sich für beide unterschiedlich und das klingt, als ob Sie versuchen, eine Art Cache zu erstellen. schwache Referenzen sind für diesen Zweck nicht gut geeignet. Siehe meine Antwort hier aus einigen Gründen, warum: http://StackOverflow.com/Questions/2861410/weakhashmap-iteration-and-garbage-collection/2862174#2862174 –
@Adamski Ich würde eine SoftReference nur für die BigDecimal und eine ReferenceQueue verwenden Entferne 'byte []' s von der Karte, sobald ein BigDecimal in die Warteschlange gestellt wurde. (Wahrscheinlich brauche ich eine BiMap).Dies kann den Aufbau von redundanten BigDecimal-Objekten eliminieren, wodurch Speicher-/GC-Laufzeit und Ausführungszeit eingespart werden (muss nur einmal konstruiert werden). – KitsuneYMG