Pergunta

Recentemente eu estava lendo sobre todos os argumentos JVM disponíveis no JRE 6 [ Java VM opções ] e vi isso:

-XX: + StringCache:. Permite o cache de strings normalmente alocados

Agora, eu estava sempre com a impressão de que o Java mantido um pool de internado (palavra correta?) Cordas e ao fazer algo como concatenação de String com literais não foi criação de novos objetos, mas puxá-los a partir desta piscina. Alguém já usou esse argumento, ou pode explicar por que seria necessário?

EDIT: I tentou executar um ponto de referência, para ver se este argumento teve qualquer efeito e foi incapaz de obter o Sun JVM para reconhecê-lo. Este foi com:

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)

Então, eu não tenho certeza se este argumento funciona em tudo.

Foi útil?

Solução 6

Eu não tenho sido capaz de encontrar uma única JVM que mesmo aceita essa suposta argumento -. Então eu acho que não há muito mais o que dizer

Outras dicas

Eu acredito que quando usado com -XX:+AggressiveOpts ele permite que os mesmos objetos String a ser devolvido ao criar o String com o mesmo texto (embora não através new String, é claro). Há uma fase de perfil, onde um cache é construir-se, e depois de um ponto de cache está ligado apenas para ler. Ela recebe as pontuações mais elevadas em certos pontos de referência.

XX: -UseStringCache funciona para mim, estranhamente.

minha versão jdk deve ser 1.6.0_22

Eu também não poderia obter o acima para o trabalho, mas as últimas JBB @ spec.org mostra que é uso: -XX: -UseStringCache. Vou ter de benchmarks re-run para ver se ele faz a diferença (um aplicativo pesado XML).

Eu também não tenho sido capaz de encontrar uma JVM que respeite esta definição; como comentou a qualidade e, portanto, utilidade da documentação em torno de parâmetros JVM é terrível, e ainda assim, por alguma razão parece ser uma área onde os vendedores JVM ver espaço para a diferenciação competitiva -. apesar de ser justo Oracle / Sun é de longe o pior

De qualquer forma, se você achar que a sua aplicação em alguma área particular utiliza um pequeno número de valores de cadeia repetidamente, então é definitivamente sensato usar internar - usando o método String.intern () para retornar um valor de estagiário-piscina. Note que você tem que usar o valor de retorno, isso não é um efeito colateral sobre o valor original.

Tal como acontece com todos os ajustes de perfil / performance Isso precisa ser feito com cuidado com métricas e testes. Pode ser significativo (foi para mim), mas se o conjunto de valores não é pequena que degrada o desempenho e você precisa estar ciente de que o conjunto de valores String é realizada no Perm Gen e então usá-lo vai afetar o uso de memória, GC etc.

A partir do JDK 8.0, esta opção foi removida. Não está claro para mim o que, se alguma coisa, pode ser usado como um substituto.

http://docs.oracle.com/ JavaSE / 8 / docs / technotes / ferramentas / unix / java.html

 -XX:+UseStringCache

    Enables caching of commonly allocated strings. This option was removed from JDK 8 
    with no replacement.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top