web-dev-qa-db-fra.com

Quelle est la différence entre Java Non Heap Memory et Stack Memory? Sont-ils identiques sinon quelle est la différence entre eux?

J'utilise Jconsole pour surveiller une Java. L'onglet mémoire affiche différentes mémoires Heap et Non Heap comme

  1. Utilisation de la mémoire de tas
  2. Utilisation de la mémoire non tas
  3. Pool de mémoire "CMS Old Gen"
  4. Pool de mémoire "Par Eden Space"
  5. Pool de mémoire "Par Survivor Space"
  6. Pool de mémoire "Code Cache"
  7. Pool de mémoire "CMS Perm Gen"

Quelle est la différence entre ces termes. Veuillez également fournir des informations sur - comment trouver des anomalies dans le comportement de l'application en surveillant ces paramètres.

15
user2885295

Il existe essentiellement trois catégories de stockage dans tous les langages basés sur C (et la plupart des autres langages):

  1. Tas
  2. Empiler
  3. Statique (avec plusieurs variantes)

Tas que vous connaissez.

Stack que vous connaissez également, mais vous ne le savez tout simplement pas. Lorsque vous avez une méthode avec des variables "locales", ces variables sont allouées dans un "cadre d'invocation". Le "cadre d'invocation" est alloué lorsque vous appelez la méthode et supprimé lorsque vous revenez de la méthode, et donc il est plus efficacement mis en œuvre en utilisant une "pile" qui grandit avec l'appel et se rétrécit avec le retour.

Statique est une substance que vous n'affectez pas explicitement et qui existe essentiellement à partir du moment où l'exécution du programme commence.

L'espace requis pour la pile est généralement assez petit et est regroupé avec "Non Heap Memory" dans les catégories ci-dessus.

11
Hot Licks

La mémoire autre que le tas est toute la mémoire allouée par la JVM à des fins autres que le tas. Ceci comprend:

  • les piles d'appels (comme vous l'avez noté);
  • mémoire allouée par le code natif (par exemple pour la mise en cache hors segment);
  • dans HotSpot 8, le Metaspace (remplacement de la génération permanente);
  • mémoire utilisée par le compilateur JIT (code natif compilé).

Dans votre liste, "CMS Old Gen", "Par Eden Space", "Par Survivor Space" et "CMS Perm Gen", tous se réfèrent à différentes sections du tas.

8
Marko Topolnik

Veuillez suivre les liens http://www.yourkit.com/docs/kb/sizes.jsp et http://publib.boulder.ibm.com/infocenter/javasdk/v5r0 /index.jsp?topic=%2Fcom.ibm.Java.doc.diagnostics.50%2Fdiag%2Fproblem_determination%2Faix_mem_heaps.html

Non-tas En outre, la JVM a une mémoire autre que le tas, appelée mémoire non-tas. Il est créé au démarrage de la JVM et stocke les structures par classe telles que le pool de constantes d'exécution, les données de champ et de méthode, ainsi que le code des méthodes et des constructeurs, ainsi que les chaînes internes.

Malheureusement, la seule information que JVM fournit sur la mémoire non tas est sa taille globale. Aucune information détaillée sur le contenu de la mémoire autre que le tas n'est disponible.

La croissance anormale de la taille de la mémoire non-tas peut indiquer un problème potentiel, dans ce cas, vous pouvez vérifier les éléments suivants:

S'il y a des problèmes de chargement de classe tels que des chargeurs qui ont fui. Dans ce cas, le problème peut être résolu à l'aide de la vue Chargeurs de classe. S'il y a des chaînes qui sont massivement internées. Pour la détection d'un tel problème, l'enregistrement d'allocation d'objet peut être utilisé.

1
Ahmet Karakaya