JVM XX: argumento + StringCache?
-
20-08-2019 - |
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.
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.