Alternativen zu Java String Interning

8

Da Javas Standard-String-Interning sehr schlecht ist, suche ich nach einer Alternative.

Können Sie eine API vorschlagen, die eine gute Alternative zum Java-String-Interning ist? Meine Anwendung verwendet Java 6. Meine Anforderung besteht hauptsächlich darin, doppelte Zeichenketten durch Internieren zu vermeiden.

In Bezug auf die schlechte Presse:

  • String intern wird über eine native Methode implementiert. Und die C-Implementierung verwendet eine feste Größe von einigen 1k-Einträgen und skaliert sehr schlecht für eine große Anzahl von Zeichenfolgen.
  • Java 6 speichert internierte Strings in Perm gen. Und deshalb werden GC'd nicht und möglicherweise zu Dauerfehlern führen. Ich weiß, das ist in Java 7 behoben, aber ich kann nicht auf Java 7 aktualisieren.

Warum muss ich intering verwenden?

  • Meine Anwendung ist eine Server-App mit einer Heap-Größe von 10-20G für verschiedene Bereitstellungen.
  • Beim Profiling haben wir festgestellt, dass Hunderttausende von Strings Duplikate sind, und wir können die Speichernutzung signifikant verbessern, indem wir doppelte Strings vermeiden.
  • Speicher war für uns ein Flaschenhals und deshalb zielen wir darauf ab, anstatt eine vorzeitige Optimierung vorzunehmen.
ManojGumber 09.10.2012, 04:44
quelle

1 Antwort

10
  

String intern wird über eine native Methode implementiert. Und die C-Implementierung verwendet eine feste Größe von etwa 1k Einträgen und skaliert sehr schlecht für eine große Anzahl von Zeichenfolgen.

Es skaliert schlecht für viele tausend Strings.

  

Java 6 speichert internierte Strings in Perm gen. Und deshalb sind GC'd nicht

Es wird gereinigt, wenn die Dauerwelle gereinigt ist, was nicht oft ist, aber es kann bedeuten, dass Sie das Maximum dieses Raums erreichen, wenn Sie es nicht erhöhen.

  

Meine Anwendung ist eine Server-App mit einer Heap-Größe von 10-20G für verschiedene Bereitstellungen.

Ich schlage vor, dass Sie in Betracht ziehen, Off-Heap-Speicher zu verwenden. Ich habe 500 GB im Off-Heap-Speicher und etwa 1 GB in Heap in einer Anwendung. Es ist nicht in allen Fällen nützlich, aber eine Überlegung wert.

  

Beim Profiling haben wir festgestellt, dass Hunderttausende von Strings Duplikate sind, und wir können die Speichernutzung erheblich verbessern, indem wir doppelte Strings vermeiden.

Dafür habe ich ein einfaches Array von String verwendet. Dies ist sehr leicht und Sie können die Obergrenze der gespeicherten Strings leicht kontrollieren.

Hier ist ein Beispiel für generische Interner.

%Vor%

Eine interessante Eigenschaft dieses Caches ist, dass es nicht threadsicher ist.

Für zusätzliche Geschwindigkeit können Sie eine Stärke von 2 Größe und eine Bitmaske verwenden, aber es ist komplizierter und funktioniert möglicherweise nicht sehr gut, abhängig davon, wie Ihre HashCodes berechnet werden.

    
Peter Lawrey 09.10.2012 06:12
quelle