Wie kann ich den Code optimieren, um immer den gleichen Verweis auf einen String zu verwenden, ohne die Speichernutzung zu erhöhen?

9

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?

    
Daniel Pereira 15.10.2012, 18:18
quelle

3 Antworten

1

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 :

%Vor%

und die interne Methode:

%Vor%     
Daniel Pereira 16.10.2012, 17:07
quelle
0

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

    
Ankur Shanbhag 16.10.2012 09:40
quelle
0

In einem ähnlichen Fall habe ich die Stringkonstanten wo immer möglich auf enums umgestellt. Auf diese Weise erhalten Sie zwei Vorteile:

  • enum-Instanzen sind Singletons, Sie haben also keine Speicherprobleme
  • keine Tippfehler bei der Verwendung von Strings.

Nachteile:

  • eine Menge Arbeit, mit endlosen Möglichkeiten, Fehler zu machen, wenn Sie nicht genug Testfälle haben
  • Manchmal ist das nicht trivial, wenn Sie zum Beispiel mit Bibliotheken von Drittanbietern interagieren müssen, können Sie nicht einfach ...
  • bearbeiten
  • einfach ein No-Go, wenn diese Laufzeit bestimmt sind, und nicht kompilieren Zeit ...
ppeterka 16.10.2012 09:57
quelle