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.
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.
Tags und Links string java memory string-interning