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.

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top