JVM -XX: + argomento StringCache?
-
20-08-2019 - |
Domanda
Di recente ho letto tutti gli argomenti JVM disponibili in JRE 6 [ VM Java Opzioni ] e ho visto questo:
-XX: + StringCache: abilita la memorizzazione nella cache delle stringhe allocate comunemente.
Ora ho sempre avuto l'impressione che Java mantenesse un pool di stringhe internate (parola corretta?) e quando si faceva qualcosa come la concatenazione di stringhe con i letterali non si creavano nuovi oggetti, ma si estraevano da questo pool. Qualcuno ha mai usato questo argomento o può spiegare perché sarebbe necessario?
EDIT: ho tentato di eseguire un benchmark, per vedere se questo argomento ha avuto qualche effetto e non sono riuscito a far riconoscere Sun JVM. Questo era con:
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)
Quindi non sono sicuro che questo argomento funzioni affatto.
Soluzione 6
Non sono stato in grado di trovare una sola JVM che accetti nemmeno questo supposto argomento - quindi immagino non ci sia molto altro da dire.
Altri suggerimenti
Credo che se usato con -XX:+AggressiveOpts
consente di restituire gli stessi String
oggetti quando si crea new String
con lo stesso testo (anche se non attraverso <=>, ovviamente). Esiste una fase del profilo in cui viene creata una cache e dopo un certo punto la cache passa in sola lettura. Ottiene punteggi più alti in alcuni benchmark.
-XX: -UseStringCache funziona per me, stranamente.
la mia versione di jdk dovrebbe essere 1.6.0_22
Anche io non sono riuscito a far funzionare quanto sopra, ma l'ultimo JBB @ spec.org mostra che è in uso: -XX: -UseStringCache. Dovrò rieseguire i benchmark per vedere se fa la differenza (un'app pesante XML).
Inoltre non sono stato in grado di trovare una JVM che rispetti questa impostazione; come commentato la qualità e quindi l'utilità della documentazione relativa ai parametri JVM è terribile, eppure per qualche motivo sembra essere un'area in cui i venditori di JVM vedono spazio per una differenziazione competitiva, sebbene essere onesti Oracle / Sun è di gran lunga il peggiore.
Ad ogni modo, se scopri che la tua app in una particolare area usa ripetutamente un piccolo numero di valori di stringa, allora è sicuramente sensato usare interning - usando il metodo String.intern () per restituire un valore di pool interno. Si noti che è necessario utilizzare il valore restituito, questo non è un effetto collaterale sul valore originale.
Come per tutte le modifiche di profiling / performance, questo deve essere fatto con attenzione con metriche e test. Può essere significativo (è stato per me) ma se il pool di valori non è piccolo, ciò peggiora le prestazioni e devi essere consapevole che il pool di valori String è contenuto in Perm Gen e quindi l'utilizzo influirà sull'utilizzo della memoria, GC ecc.
A partire da JDK 8.0, questa opzione è stata rimossa. Non mi è chiaro cosa, se non altro, possa essere usato come sostituto.
http://docs.oracle.com/ JavaSE / 8 / docs / note tecniche / strumenti / unix / java.html
-XX:+UseStringCache Enables caching of commonly allocated strings. This option was removed from JDK 8 with no replacement.