Alguém pode explicar quais são as opções JVM ReservedCodeCacheSize
e quais InitialCodeCacheSize
são? Especificamente quando / por que eu iria querer mudar isso? Como decido qual é o tamanho certo?
É o que dizem os documentos:
-XX: ReservedCodeCacheSize = 32m Tamanho do cache de código reservado (em bytes) - tamanho máximo do cache de código. [Solaris 64 bits, amd64 e -server x86: 2048m; em 1.5.0_06 e anterior, Solaris de 64 bits e and64: 1024m.]
java
jvm
jvm-hotspot
Raghu
fonte
fonte
Respostas:
ReservedCodeCacheSize
(eInitialCodeCacheSize
) é uma opção para o compilador (just-in-time) do Java Hotspot VM. Basicamente, ele define o tamanho máximo do cache de código do compilador.O cache pode ficar cheio, o que resulta em avisos como os seguintes:
Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache [0x000000010958f000, 0x000000010c52f000, 0x000000010c58f000) total_blobs=15406 nmethods=14989 adapters=362 free_code_cache=835Kb largest_free_block=449792
É muito pior quando seguido por
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated
.Quando definir esta opção?
Normalmente você não mudaria este valor. Eu acho que os valores padrão são bem balanceados porque esses problemas ocorrem apenas em ocasiões muito raras (na minha experiência).
fonte
Reserved code cache size (in bytes) - maximum code cache size. [Solaris 64-bit, amd64, and -server x86: 48m; in 1.5.0_06 and earlier, Solaris 64-bit and amd64: 1024m.]
Não sei os valores do OpenJDK. Um aumento moderado deve ser suficiente (a configuração anterior de 1024 m estava além do bem e do mal).@jeha responde a tudo que eu queria saber dessa pergunta, além de qual valor definir os parâmetros. Como não escrevi o código que estava implantando, não tive muita visibilidade da área de cobertura de memória que ele tinha.
No entanto, você pode usar jconsole para anexar ao seu processo Java em execução e, em seguida, usar a guia 'Memória' para descobrir o tamanho do Cache de Código. Para completar, as etapas são (ambiente de VM Linux, embora eu tenha certeza de que outros ambientes são semelhantes):
Novamente, pode demorar alguns minutos para que a tela seja atualizada e, em seguida, você deverá ver algo como:
Como você pode ver, meu cache de código está usando aproximadamente 49 MB. Neste ponto eu ainda tinha o padrão que a documentação (e @jeha) diz é de 48 MB. Certamente uma grande motivação para eu aumentar a configuração!
Ben.
1024 MB por padrão provavelmente era um exagero, mas 48 MB por padrão parece ser insuficiente ...
fonte
Uma boa experiência de aprendizado com a equipe de engenharia do Even e os desafios que eles enfrentaram ao migrar para o jdk 8.
http://engineering.indeedblog.com/blog/2016/09/job-search-web-app-java-8-migration/
Conclusão: Jdk 8 precisa de mais cache de código han JDK 7
O tamanho do codecache padrão para JRE 8 é cerca de 250 MB, cerca de cinco vezes maior do que o tamanho padrão de 48 MB para JRE 7. Nossa experiência é que o JRE 8 precisa desse codecache extra. Trocamos cerca de dez serviços para o JRE 8 até agora e todos eles usam cerca de quatro vezes mais codecache do que antes.
fonte
de https://blogs.oracle.com/poonam/entry/why_do_i_get_message :
Portanto, essa informação pode valer a pena mencionar para sistemas em execução no JDK 6 (com a liberação de código desativada) e 7.
fonte