Frage

Ich war vor kurzem zu lesen über all die JVM-Argumente in JRE 6 [ Java VM Optionen ] und sah folgendermaßen aus:

  

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

Nun war ich immer den Eindruck, dass Java einen Pool von Internierung gehalten (richtigen Wort?) Strings und wenn sie mit Literalen etwas wie String-Verkettung tut es war die Schaffung kein neue Objekte, sondern sie aus diesem Pool zu ziehen. Hat jemand schon einmal dieses Argument verwendet wird, oder kann erklären, warum es notwendig sein würde?

EDIT: Ich habe versucht, einen Maßstab zu laufen, um zu sehen, ob dieses Argument keine Wirkung hatte und war nicht in der Lage der 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 nicht sicher, ob dieses Argument überhaupt funktioniert.

War es hilfreich?

Lösung 6

Ich habe nicht in der Lage gewesen, eine einzige JVM zu finden, die auch dieses vermeintliche Argument akzeptiert -. So dass ich denke, es gibt nicht viel zu sagen

Andere Tipps

Ich glaube, wenn sie mit -XX:+AggressiveOpts verwendet es die gleichen String Objekte ermöglicht zurückgegeben werden, wenn die String mit dem gleichen Text zu schaffen (wenn auch nicht durch new String, natürlich). Es ist eine Profil Phase, wo ein Cache aufzubauen ist, und nach einem Punkt der Cache geschaltet wird nur zu lesen. Es wird höhere Werte in bestimmten Benchmarks.

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

meine jdk Version sollte 1.6.0_22 sein

Ich konnte auch nicht die oben zu arbeiten, aber die neueste JBB @ spec.org zeigt es Gebrauch ist: -XX: -UseStringCache. Ich muss wieder laufen Benchmarks zu sehen, ob es einen Unterschied macht (eine XML-schwere app).

Ich habe auch nicht in der Lage gewesen, eine JVM zu finden, das diese Einstellung respektiert; die Qualität und somit Nützlichkeit der Dokumentation um JVM-Parameter kommentiert ist schrecklich, und doch aus irgendeinem Grunde scheint einen Bereich, in dem JVM-Anbieter Raum für die Differenzierung im Wettbewerb zu sehen -. obwohl fair zu sein Oracle / Sun ist mit Abstand der schlechtesten

Wie auch immer, wenn Sie feststellen, dass Ihre Anwendung in einem bestimmten Bereich eine geringe Anzahl von String-Werten verwendet wiederholt, dann ist es auf jeden Fall sinnvoll interning zu nutzen - durch den String.intern () -Methode mit einem intern-pool Wert zurückzukehren. Beachten Sie, dass Sie den Rückgabewert verwenden, ist dies nicht eine Nebenwirkung auf den ursprünglichen Wert.

Wie bei allen Profilierung / Performance-Verbesserungen dies muss sorgfältig mit Metriken und Tests durchgeführt werden. Es kann von Bedeutung sein (war für mich), aber wenn der Pool von Werten ist nicht klein es beeinträchtigt die Leistung und Sie müssen sich bewusst sein, dass der Pool von String-Werte in der Perm Gen gehalten wird und so verwendet, wird es Speicherverbrauch beeinflussen, GC etc.

Ab JDK 8.0, ist diese Option entfernt wurde. Es ist mir unklar, was, wenn überhaupt, kann als Ersatz verwendet werden.

http://docs.oracle.com/ JavaSE / 8 / docs / technotes / tools / Unix / java.html

 -XX:+UseStringCache

    Enables caching of commonly allocated strings. This option was removed from JDK 8 
    with no replacement.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top