2016-03-07 1 views
2

Voici quelques questions sur zone de cache dans JVM: (pour hotspot Java8)jvm - A propos de la zone de cache de code

  • Est-ce que tout le code machine qui JvM pourrait ruisseler stocké dans ce domaine, ou seulement un code chaud est stocké ici?
  • De un livre, il dit compilateur client (C1) est plus susceptible de manquer de mémoire dans la zone de cache, tandis que le compilateur serveur (C2) ne le font pas. Je suis un peu confus à ce sujet. Est-ce parce que le compilateur de serveur compile seulement la partie chaude et interrompt l'autre partie? Dans ce cas, le compilateur de serveur ne devrait-il pas être lent?
  • Combien de fois le code est exécuté avant C1 & C2 compilerait les mettre en cache & respectivement?
+1

Par ailleurs, si vous êtes intéressé par la performance, [ce livre] (http://shop.oreilly.com/product/0636920028499.do) donne un bon aperçu des nombreux aspects de celui-ci. – biziclop

+0

@biziclop Belle suggestion, merci. –

Répondre

2

Notez que la réponse à cela peut varier d'une mise en application:

Est-ce que tout le code machine qui pourrait ruisseler JvM stocké dans ce domaine, ou seulement un code à chaud est stocké ici?

cache de code sera presque toujours utilisé pour mettre en cache méthodes chaudes (ou des méthodes qui étaient autrefois considérés comme chaud par C1 + C2 (compilation niveaux)

De un livre, il dit compilateur client (C1) est plus susceptible de manquer de la mémoire dans la zone de cache, tandis que le compilateur serveur (C2) ne le font pas. Je suis un peu confus à ce sujet. est-ce parce que le compilateur serveur uniquement compiler la partie chaude , et interrompre l'autre partie? Dans ce cas, le compilateur du serveur ne devrait-il pas être lent?

compilateur C1 compile tout. C2 attend jusqu'à ce qu'il trouve des optimisations qui pourraient être appliquées, puis applique ces optimisations et compile les méthodes (pas toujours vrai, mais surtout).

Notez que C1 peut compiler la même méthode plusieurs fois.

Combien de fois le code est exécuté avant C1 C2 & ne les compiler respectivement?

Une méthode peut être compilée même si elle n'est appelée qu'une seule fois si C1/C2 s'aperçoit que l'exécution est longue.

Vous pouvez utiliser JITWatch pour voir C1 et C2 en action.

+0

Thx, mais la réponse à la première question est un peu flou pour moi, je me concentre principalement sur java8 hotspot, pouvez-vous le rendre plus clair sur cette base. –

+2

'Une méthode peut être compilée même si elle n'est appelée qu'une seule fois si C1/C2 s'aperçoit que l'exécution est longue.'Pas directement, mais pour chaque boucle il y a un nombre de branchements, qui indique à Hotspot combien d'itérations la boucle a fait. Si ce compteur atteint le seuil, la boucle elle-même est compilée, même si la méthode elle-même est toujours en cours d'exécution. – biziclop

+0

@biziclop A propos de la première question, en utilisant c1, si une méthode ne s'exécute qu'une seule fois et qu'elle est très rapide pour jvm, la méthode sera toujours compilée, n'est-ce pas? Et sera-t-il encore mis en cache dans la zone de cache de code? –