Maison  >  Article  >  Java  >  Explication détaillée de la gestion de la mémoire Java et des exceptions de dépassement de mémoire

Explication détaillée de la gestion de la mémoire Java et des exceptions de dépassement de mémoire

黄舟
黄舟original
2017-10-18 09:35:421652parcourir

L'éditeur suivant vous proposera une brève discussion sur la gestion de la mémoire Java et les exceptions de dépassement de mémoire. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un coup d'œil.

En parlant de gestion de la mémoire, je voudrais d'abord comparer les différences entre Java, C et C++ :

En C et C++, la gestion de la mémoire est la responsabilité des programmeurs, ce qui signifie que les programmeurs doivent effectuer un gros travail d'écriture de code et toujours considérer la maintenance de la mémoire système

En Java, les programmeurs n'ont pas besoin de considérer contrôle et maintenance de la mémoire, mais laissez la JVM les gérer automatiquement, afin que les fuites de mémoire et les problèmes de débordement soient moins susceptibles de se produire. Cependant, lorsque des problèmes de fuites et de débordements de mémoire surviennent, il est difficile de trouver l'erreur sans comprendre le mécanisme de gestion de la mémoire de la JVM.

1. Zone de données d'exécution de la JVM

Lors de l'exécution d'un programme Java, la JVM divisera la mémoire qu'elle gère en plusieurs zones différentes, celles-ci les zones ont non seulement leurs propres objectifs, mais ont également du temps pour la création et la destruction. De manière générale, il contient les zones de données d'exécution suivantes :

La zone orange est privée à chaque thread, c'est-à-dire que chaque thread aura sa propre copie, et la zone verte La zone est partagée par chaque thread.

2.Création d'objets Java

Vérification du chargement des classes

Lorsque la JVM analysera le nouveau mot-clé, elle vérifiera d'abord si les paramètres de cette instruction peuvent localiser une référence symbolique d'une classe dans le pool constant, et vérifiera si la classe représentée par la référence symbolique de cette classe a été chargé. Analysé et initialisé. Sinon, le processus de chargement de classe correspondant doit être effectué en premier.

Allocation de mémoire

Lorsque la vérification de chargement de classe réussit, la JVM doit allouer de la mémoire pour le nouvel objet, ce qui signifie diviser une mémoire d'une certaine taille du java tas. Il existe deux méthodes de division couramment utilisées : Collision de pointeur (nécessite que la mémoire du tas soit absolument régulière), liste libre (la mémoire du tas n'est pas régulière).

Initialisation de la mémoire

La JVM doit initialiser tout l'espace mémoire alloué à des valeurs nulles (à l'exclusion des en-têtes d'objet), ce qui garantit que les champs d'instance de l'objet sont en java Le code peut être utilisé directement sans attribuer de valeurs initiales, ce qui signifie que le programme peut accéder à la valeur zéro correspondant au type de données de ces champs.

Initialisation de l'objet

Exécutez la méthode pour initialiser l'objet selon les souhaits du programmeur.

3. Accéder au positionnement des objets

Une fois les objets créés, nous souhaitons également pouvoir accéder à ces objets rapidement, ce qui nécessite JVM Les données de référence sur la pile sont utilisées pour trouver l'objet spécifique dans le tas. Actuellement, les méthodes d'accès les plus couramment utilisées sont "méthode handle" et "pointeur direct".

Si vous utilisez la méthode handle pour accéder, vous devez diviser une partie de la mémoire dans le tas en tant que pool de handles. La variable de référence stocke l'adresse du handle de l'objet et le handle contient les détails spécifiques. des données d’instance d’objet et des données d’adresse.

Si vous utilisez l'accès direct par pointeur, ce qui est stocké dans la variable de référence est directement l'adresse de l'objet, mais vous devez réfléchir à la manière de placer les informations pertinentes du type data .

4. Exception de dépassement de mémoire

En plus du registre PC, la zone de données d'exécution de la JVM a d'autres exceptions de débordement de mémoire qui peuvent se produire dans n'importe quelle zone de mémoire. Le registre PC est la seule zone qui ne spécifie aucune condition OutOfMemoryError (OOM) dans la spécification JVM.

Débordement de tas

Le tas en Java est utilisé pour stocker des instances d'objets. Si des objets sont créés en continu, il est garanti qu'il existe un chemin accessible entre les racines GC et. l'objet pour éviter le traitement de recyclage GC, une exception de débordement de tas se produira une fois que le nombre d'objets aura atteint la limite maximale de capacité du tas.

Débordement de pile (y compris la pile JVM et la pile de méthodes locales)

1 Si la profondeur de pile demandée par le thread est supérieure au maximum. profondeur autorisée par la JVM, une exception StackOverflowError sera levée

2. Si la JVM ne peut pas demander suffisamment d'espace mémoire lors de l'expansion de la pile, une exception OutOfMemoryError sera levée.

De plus, il existe des débordements de zone de méthode, des débordements de pool constants, des débordements de mémoire native, etc.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn