2009-06-26 10 views
18

Ich war über all die JVM-Argumente in JRE 6 [Java VM Options] und sah vor kurzem der Lektüre dieses:JVM -XX: + StringCache Argument?

-XX: + StringCache: Ermöglicht Caching von häufig zugeordneten Strings. Jetzt

Ich war immer unter dem Eindruck, dass Java einen Pool von Internierung gehalten (richtigen Wort?) Strings und wenn sie mit Literalen etwas wie String-Verkettung tut es nicht neue Objekte zu schaffen, sondern sie aus diesem Pool zu ziehen. Hat jemand dieses Argument jemals benutzt oder kann es erklären, warum es nötig wäre?

EDIT: Ich habe versucht, einen Benchmark auszuführen, um zu sehen, ob dieses Argument eine Wirkung hatte und konnte nicht die Sun JVM, um es zu erkennen. Dies war mit:

java version "1.6.0_11" 
Java(TM) SE Runtime Environment (build 1.6.0_11-b03) 
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, 
sharing) 

Also ich bin mir nicht sicher, ob dieses Argument überhaupt funktioniert.

+2

denke ich, die meisten String-Operationen Internierung nicht verwenden. Das Internieren wird vielmehr von der JVM verwendet, um Zeichenfolgenwerte aus den Klassendateien zu speichern und übermäßigen Speicherverbrauch aufgrund von Duplikaten zu vermeiden. – akarnokd

+0

Große Frage. Die Sonnendokumente sind hier sehr unklar. Dokumente zum Internieren sind jedoch klar, dass es nur unter bestimmten Umständen funktioniert (String-Literale). Vielleicht wendet die JVM arg dieses Verhalten unter einer größeren Anzahl von Umständen an. –

+0

Ich kann diese Option in der OpenJDK-Quelle nicht finden. Was denkst du, das heißt? –

Antwort

0

Ich konnte keine einzige JVM finden, die dieses angebliche Argument akzeptiert - also denke ich, dass es nicht viel zu sagen gibt.

+0

Oracle JRocket 6;) http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionXX.html –

+3

Sie benötigen -XX: + AggressiveOpts, um viele der seltsamen Optionen, -XX, zu aktivieren : + UseStringCache einschließlich. Hier ist ref: http://mail.openjdk.java.net/pipermail/jdk7-dev/2011-April/002024.html – bestsss

6

ich, wenn sie mit -XX:+AggressiveOpts es ermöglicht, dass die gleichen String Objekte verwendet glaube zurückgegeben werden, wenn die String mit dem gleichen Text zu schaffen (wenn auch nicht durch new String, natürlich). Es gibt eine Profilphase, in der ein Cache erstellt wird, und nach einem Punkt wird der Cache auf Nur lesen umgeschaltet. In bestimmten Benchmarks werden höhere Werte erzielt.

1

Auch ich konnte das obige nicht zum Laufen bringen, aber das neueste JBB @ spec.org zeigt, dass es verwendet wird: -XX: -UseStringCache. Ich muss Benchmarks erneut ausführen, um zu sehen, ob es einen Unterschied macht (eine XML-Heavy-App).

1

Ich konnte auch keine JVM finden, die diese Einstellung berücksichtigt; Wie bereits erwähnt, ist die Qualität und damit die Nützlichkeit der Dokumentation um die JVM-Parameter schrecklich, und dennoch erscheint JVM-Anbietern aus irgendeinem Grund ein Raum für eine Wettbewerbsdifferenzierung - obwohl Oracle/Sun mit Abstand am schlechtesten ist.

Jedenfalls, wenn Sie feststellen, dass Ihre App in einem bestimmten Bereich eine kleine Anzahl von String-Werten wiederholt verwendet, ist es definitiv sinnvoll, Interning zu verwenden - mit der String.intern() -Methode, um einen internen Pool-Wert zurückzugeben. Beachten Sie, dass Sie den Rückgabewert verwenden müssen, dies ist kein Nebeneffekt auf den ursprünglichen Wert.

Wie bei allen Profiling/Performance-Optimierungen muss dies sorgfältig mit Metriken und Tests durchgeführt werden. Es kann bedeutsam sein (war für mich), aber wenn der Wertepool nicht klein ist, verschlechtert es die Performance und Sie müssen beachten, dass der Pool von String-Werten in der Perm Gen enthalten ist usw.

3

-XX: -UseStringCache funktioniert für mich, seltsam.

sollte meine jdk Version 1.6.0_22 sein