Quelqu'un peut-il expliquer en quoi consistent les options ReservedCodeCacheSize
et InitialCodeCacheSize
de la machine virtuelle Java? Plus précisément quand/pourquoi voudrais-je le changer? Comment puis-je décider quelle est la bonne taille?
Voici ce que disent les docs:
-XX: ReservedCodeCacheSize = 32m Taille du cache de code réservé (en octets) - taille maximale du cache de code. [Solaris 64 bits, AMD64 et -server x86: 2048m; dans les versions 1.5.0_06 et antérieures, Solaris 64 bits et and64: 1024 m.]
ReservedCodeCacheSize
(et InitialCodeCacheSize
) est une option pour le compilateur (juste à temps) de la machine virtuelle Java Hotspot. Fondamentalement, il définit la taille maximale du cache de code du compilateur.
Le cache peut devenir plein, ce qui entraîne des avertissements tels que:
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
C'est bien pire quand suivi de Java HotSpot(TM) Client VM warning: Exception Java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated
.
Quand définir cette option?
Normalement, vous ne changez pas cette valeur. Je pense que les valeurs par défaut sont assez bien équilibrées parce que ces problèmes ne surviennent que très rarement (à mon avis).
@jeha répond à tout ce que je voulais savoir de cette question, mis à part la valeur à laquelle définir les paramètres. Comme je n’écrivais pas le code que je déployais, je n’avais pas beaucoup de visibilité sur l’empreinte mémoire dont elle disposait.
Cependant, vous pouvez utiliser jconsole pour vous connecter à votre processus Java en cours d'exécution, puis utiliser l'onglet "Mémoire" pour connaître la taille du cache de code. Pour être complet, les étapes sont les suivantes (environnement Linux VM, même si je suis sûr que d'autres environnements sont similaires):
Encore une fois, cela peut prendre quelques instants pour que l’écran se régénère, puis vous devriez voir quelque chose comme:
Comme vous pouvez le constater, mon cache de code utilise environ 49 Mo. À ce stade, il me restait le paramètre par défaut qui, selon la documentation (et @jeha), est de 48 Mo. Certainement une grande motivation pour moi pour augmenter le réglage!
Ben.
1024 Mo par défaut en faisaient probablement trop, mais 48 Mo par défaut semble le faire trop peu ...
Une bonne expérience d’apprentissage de la part de l’équipe technique d’Intelligent et des difficultés qu’elle a rencontrées lors de la migration vers jdk 8.
http://engineering.indeedblog.com/blog/2016/09/job-search-web-app-Java-8-migration/
Conclusion: Jdk 8 nécessite davantage de cache de code par rapport à JDK 7
La taille de codecache par défaut pour JRE 8 est d'environ 250 Mo, soit cinq fois plus que celle de 48 Mo par défaut pour JRE 7. Notre expérience montre que JRE 8 a besoin de ce codecache supplémentaire. Nous avons déjà remplacé une dizaine de services par JRE 8 et tous utilisent environ quatre fois plus de codecache qu'auparavant.
from https://blogs.Oracle.com/poonam/entry/why_do_i_get_message :
Voici deux problèmes connus de jdk7u4 + en ce qui concerne le vidage CodeCache:
- Le compilateur peut ne pas être redémarré même après que l'occupation CodeCache ait été réduite à près de la moitié après le rinçage d'urgence.
- Le rinçage d'urgence peut entraîner une utilisation élevée du processeur par les threads du compilateur, entraînant une dégradation des performances globales.
Ce problème de performances et le problème de non réactivation du compilateur ont été résolus dans JDK8. Pour résoudre ces problèmes dans JDK7u4 +, nous pouvons augmenter la taille du cache de code à l'aide de l'option ReservedCodeCacheSize en lui attribuant une valeur supérieure à l'empreinte de code compilé afin que CodeCache ne soit jamais saturé. Une autre solution consiste à désactiver CodeCache Flushing à l’aide de l’option -XX: -UseCodeCacheFlushing de la machine virtuelle Java.
Les problèmes mentionnés ci-dessus ont été corrigés dans JDK8 et ses mises à jour.
Il est donc utile de mentionner ces informations pour les systèmes fonctionnant sous JDK 6 (le vidage du code étant désactivé) et 7.