3 Stimmen

Kann man das Internieren von Strings in Java vermeiden?

Können wir das Internieren von Strings vollständig deaktivieren. Es mag nicht wirklich hilfreich sein, aber nur ein Gedanke. Ich kann mir zumindest einen Punkt vorstellen, an dem es hilfreich sein könnte, z.B. während des JVM-Tunings, um die Größe der Perm-Gen zu kontrollieren.

Wenn ich z.B. ein OSGI-Framework herausgebe und jeder kann eine beliebige Anzahl von eigenen Bundles hinzufügen und jeder Bundles-String kann meine Tuning-Parameter komplett durcheinander bringen. (Natürlich weiß ich, dass wir das Tuning auf einer bestimmten festen Distribution durchführen sollten, aber trotzdem...)

Irgendwelche Gedanken!!

6voto

Brian Roach Punkte 74523

Permgengröße/-verbrauch ist bei modernen JVMs kein Problem. Internierte Strings werden dem Garbage Collector zur Verfügung gestellt, wenn es keine weiteren Verweise auf sie gibt.

(Und nein, man kann das Internieren von String-Literalen nicht "abschalten").

1voto

Peter Lawrey Punkte 511323

Sie können das Internieren der meisten Strings deaktivieren, indem Sie keine String-Literale in Ihrem Code verwenden. Sie könnten stattdessen char[] verwenden und daraus Strings erstellen. Z.B..

String hi = new String(new char[] { 'h', 'i' }); // not interned.

Wie Sie schon sagten, macht das nur Arbeit für Sie und verschlimmert die Situation nur.

wenn ich ein OSGI-Framework herausgebe und jeder eine beliebige Anzahl von eigenen Bundles hinzufügen kann und jedes Bundles String-Interning meine Tuning-Parameter komplett durcheinanderbringen kann

Wenn sie Bündel hinzufügen, könnten sie einen höheren, maximalen Speicher, eine perm gen size, eine direkte Speichergröße, ein anderes NewSize-Verhältnis oder sogar eine andere GC benötigen. Die einzige Möglichkeit, dies zu verhindern, besteht darin, alle anderen Module in Ihrem OSGi-Container zu verhindern.

Oder Sie können einfach sagen, dass Sie die Tuning-Parameter ändern müssen, wenn Sie Bündel hinzufügen.

1voto

jorgeu Punkte 689

Seit Oracle's Java 7 wird der interne Stringpool nicht mehr in PerGen gespeichert. Lesen Sie hier mehr http://java-performance.info/string-intern-in-java-6-7-8/

-1voto

Amir Afghani Punkte 36713

Zeichenfolge ist eine endgültige Klasse, die nicht erweitert werden kann. Daher können Sie die Möglichkeit, Strings in Java zu internieren, nicht abschaffen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X