Ich arbeite an einer Anwendung, die viele doppelte Strings hat, und meine Aufgabe ist es, sie zu eliminieren, um die Speichernutzung zu verringern. Mein erster Gedanke war, String.intern
zu verwenden, um sicherzustellen, dass nur ein Verweis auf einen String existiert. Es funktionierte, um den Heapspeicher zu verringern, aber es erhöhte den PermGen-Weg zu sehr; Da es viele Strings gibt, die nur einmal deklariert werden, ist tatsächlich die Gesamtmenge an Speicher, die von der Anwendung verwendet wird, tatsächlich erhöht.
Nachdem ich nach anderen Ideen gesucht hatte, fand ich diesen Ansatz: Ссылка .
Es ist dasselbe passiert wie bei String.intern: Die Verwendung von Strings wurde verringert, aber der von mir gespeicherte Speicher wird in den Klassen WeakHashMap
und WeakHashMap$Entry
verwendet.
Gibt es eine effektive Möglichkeit, nur eine Referenz für jede Zeichenfolge beizubehalten, die nicht die gleiche Menge an Speicher verbraucht, die ich gerade erhole?
Ich habe eine Alternative zu WeakHashMap
gefunden: das WeakHashSet
von der Eclipse JDT-Bibliothek. Es hat das gleiche Verhalten wie WeakHashMap
, benötigt aber weniger Speicher. Außerdem müssen Sie nur die Methode add
aufrufen und die Zeichenfolge in der Menge hinzufügen, falls sie noch nicht existiert, oder die vorhandene Zeichenfolge andernfalls zurückgeben.
Das Einzige, was mir nicht gefallen hat, ist die Tatsache, dass es keine Generika benutzt, die den Entwickler zwingen, die Objekte zu werfen. Meine intern
Methode stellte sich als ziemlich einfach heraus, wie Sie unten sehen können:
Erklärung des WeakHashSet
:
und die interne Methode:
%Vor%Warum verwenden Sie die StringBuilder / StringBuffer-Klasse statt String? Wenn Sie eine Instanz dieser Klasse verwenden, können Sie immer dieselbe Instanz mit anderen Werten verwenden. - Ankur
In einem ähnlichen Fall habe ich die Stringkonstanten wo immer möglich auf enums umgestellt. Auf diese Weise erhalten Sie zwei Vorteile:
Nachteile:
Tags und Links string java optimization memory-management