84 votes

Quelles sont ReservedCodeCacheSize et InitialCodeCacheSize?

Quelqu'un peut-il expliquer ce qu'est l'option de la JVM ReservedCodeCacheSize et InitialCodeCacheSize ? Spécialement quand/pourquoi voudrais-je le changer? Comment puis-je décider quelle est la bonne taille?

C'est ce que les docs disent:

-XX:ReservedCodeCacheSize=32m Réservés cache de code de la taille (en octets), d'un maximum de code de taille de la mémoire cache. [Solaris 64 bits amd64, et serveur x86: 2048m; dans 1.5.0_06 et plus tôt, Solaris 64 bits et and64: 1024m.]

72voto

jeha Points 5463

ReservedCodeCacheSize (et InitialCodeCacheSize) est une option pour le (juste-à-temps) compilateur de Java Hotspot VM. Fondamentalement, il définit la taille maximale pour le compilateur de code du cache.

Le cache peut être pleine, ce qui entraîne dans les mises en garde suivantes:

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 lorsqu'il est suivi par Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated.

Lorsque cette option?

  1. lorsque Hotspot compilateur échecs
  2. pour réduire la mémoire nécessaire par la JVM (et donc à risquer compilateur JIT échecs)

Normalement, vous auriez pas modifier cette valeur. Je pense que les valeurs par défaut sont assez bien équilibré parce que ces problèmes se produisent dans de très rares cas seulement (dans mon metier).

12voto

Animal451 Points 404

@jeha réponses tout ce que je voulais savoir à partir de cette question, en dehors de la valeur à régler les paramètres. Comme je n'ai pas écrit le code que j'ai déploiement d'un je n'ai pas beaucoup de visibilité dans la mémoire de l'empreinte qu'il a eu.

Toutefois, vous pouvez utiliser la jconsole à joindre à votre cours d'exécution java processus, puis utilisez la "Mémoire" de l'onglet pour connaître le Code de la taille du Cache. Par souci d'exhaustivité, les étapes sont (machine virtuelle Linux environnement, mais je suis sûr que d'autres environnements sont similaires):

  1. Le feu jusqu'à jconsole sur votre machine
  2. Trouver la bonne ID de processus et de joindre jconsole (cela va prendre quelques instants)
  3. Accédez à la "Mémoire" de l'onglet
  4. À partir de la Carte: "dans la liste déroulante, sélectionnez" Pool de Mémoire "Cache de Code"'
  5. Encore une fois, cela peut prendre quelques instants pour que le rafraîchissement de l'écran, et vous devriez voir quelque chose comme: jconsole code cache image

    Comme vous pouvez le voir, mon cache de code utilise environ 49 MO. À ce point, j'ai toujours eu le défaut de laquelle la documentation (et @jeha) dit que c'est de 48 MO. Certainement une grande source de motivation pour moi de porter le réglage!

    Ben.


    1024 MO par défaut était probablement trop, mais 48 MO par défaut semble être underdoing...

6voto

Lorsque la JVM compile le code, il détient l'ensemble de la langue de l'assembly instructions de l' cache de code. Le cache de code a une taille fixe, et une fois qu'il a rempli, la JVM n'est pas capable de compiler du code supplémentaire.

La taille maximale du cache de code est défini par la -XX:ReservedCodeCacheSize=N drapeau (où N est la valeur par défaut viens de mentionner pour le compilateur). Le cache de code est géré comme la plupart de la mémoire de la JVM: il y a une taille initiale ( -XX:InitialCodeCacheSize=N). Répartition de la cache de code de la taille débute à la première taille et augmente à mesure que le cache se remplit. La taille initiale de la cache de code varie en fonction de la l'architecture de la puce et du compilateur utilisé. Le redimensionnement de la cache qui se passe en arrière-plan et n'a pas vraiment d'incidence sur la performance, de sorte que le réglage de la ReservedCodeCacheSize taille (c'est à dire, la valeur maximum de code de taille de cache) est tout ce qui est généralement nécessaire.

Par défaut pour le serveur 64 bits, Java 7 est la taille 48 MO (avec plusieurs niveaux de compilation de ses 96 MO). Dans Java 8 pour 64 bits serveur de la taille de la mémoire est de 240 MO.

-- Pinaki

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X