Maison  >  Article  >  Java  >  Comment allouer et gérer la mémoire JVM en Java ?

Comment allouer et gérer la mémoire JVM en Java ?

青灯夜游
青灯夜游avant
2018-10-22 17:37:443759parcourir

Le contenu de cet article est de présenter comment allouer et gérer la mémoire JVM en Java ? Laissez tout le monde comprendre l'algorithme de récupération de place de la JVM et le mécanisme d'allocation de mémoire de la JVM. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

1. Algorithme de collecte des déchets

  • Mécanisme d'allocation de mémoire dans la JVM

    L'algorithme de collecte des déchets a un algorithme de balayage de marque, Mark -Algorithme de collationnement et algorithme de copie. JVM utilise un algorithme de collecte générationnelle pour récupérer l'espace mémoire alloué par JVM. L'algorithme de collecte générationnelle est divisé en nouvelle génération et ancienne génération. Il collecte principalement la mémoire tas dans le modèle de mémoire JVM. , l'ancienne génération utilise l'algorithme de tri par marquage. Explorons les idées spécifiques de l'algorithme de récupération de place.

  • Algorithme de marquage-effacement :
    L'algorithme de marquage-effacement est divisé en deux étapes : marquage et effacement. Tout d'abord, marquez l'espace mémoire qui doit être recyclé après le marquage. est terminé, tous les espaces mémoire marqués seront recyclés uniformément. Il y a deux raisons principales à cela : 1. Son efficacité de marquage et de nettoyage n'est pas élevée. 2. Il générera un grand nombre de fragments de mémoire discontinus après avoir vidé l'espace objet, provoquant le déclenchement anticipé du garbage collection en raison d'une mémoire insuffisante lorsque des objets volumineux (objets nécessitant une grande quantité de mémoire continue) sont réaffectés. Son processus de recyclage est illustré dans la figure ci-dessous.

Comment allouer et gérer la mémoire JVM en Java ?

  • Algorithme de copie
    L'algorithme de copie divise la capacité de mémoire en deux blocs égaux et utilise un bloc à la fois Mémoire, lorsque cette mémoire est épuisée, copiez les objets survivants de cette mémoire dans une autre mémoire, puis effacez cet espace mémoire et allouez l'objet suivant à un autre espace mémoire, c'est-à-dire qu'il y a des objets stockés Les deux espaces mémoire sont utilisés alternativement . La nouvelle génération de mémoire de tas JVM est divisée en espace Eden, de l'espace survivant à l'espace survivant. Le rapport par défaut de l'espace Eden et survivant est de 8:1, dont Eden représente 80 %, de et vers chacun représente 10 %, et l'espace qui peut être utilisé par toute la mémoire de nouvelle génération est de 90 %. Dans la nouvelle génération, un grand nombre d’objets seront collectés lors de chaque garbage collection, de sorte que seuls quelques objets survivants devront être copiés. Voici le processus de fonctionnement de l'algorithme de copie :

Comment allouer et gérer la mémoire JVM en Java ?

  • Algorithme d'organisation des marques :
    L'algorithme de copie a un taux de survie des objets plus élevé. Il n'est pas facile à utiliser dans des contextes élevés car cela nécessite de copier un grand nombre d'objets vivants. Plus important encore, l'algorithme de copie gaspillera de l'espace. Comme l’ancienne génération stocke certains objets avec des durées de vie relativement longues, il n’est pas adapté à l’utilisation de l’algorithme de réplication. Selon les caractéristiques de l’époque ancienne, l’algorithme de tri par marquage a été produit. L'algorithme de marquage-compact marque d'abord les objets survivants, puis les déplace vers une extrémité, puis libère la mémoire de l'objet en dehors de la limite d'extrémité. Le processus d'exécution de l'algorithme de marquage-collage est le suivant :

Comment allouer et gérer la mémoire JVM en Java ?

2. Allocation de mémoire et stratégie de recyclage
Dans le système technologique Java La gestion automatique de la mémoire préconisée peut en fin de compte être attribuée à l'allocation automatique de mémoire aux objets et à la récupération de la mémoire allouée aux objets. Concernant la récupération de mémoire, vous pouvez vous référer à l'algorithme de garbage collection ci-dessus. La JVM utilise un algorithme de garbage collection générationnel pour recycler la mémoire des objets, qui est divisée en la nouvelle génération et l'ancienne génération. La nouvelle génération utilise l'algorithme de copie et l'ancienne. la génération utilise l’algorithme de tri par marquage. Jetons un coup d'œil à la stratégie d'allocation de mémoire de la JVM :

  • Les objets sont d'abord alloués dans la zone Eden
    Dans la plupart des cas, les objets sont alloués dans la zone Eden de nouvelle génération. Lorsque la zone Eden ne dispose pas de suffisamment d'espace mémoire pour l'allocation, la machine virtuelle lancera un GC mineur (GC de nouvelle génération) pour recycler les objets morts de la nouvelle génération. Les objets survivants sont stockés dans la zone survivante. Si vous avez suffisamment d'espace, le stockage sera directement déposé dans l'ancienne génération grâce à la garantie d'allocation d'espace. Rangez ensuite l'objet dans la zone Eden.

  • Les gros objets entrent directement dans l'ancienne génération
    Les gros objets font référence à des objets qui nécessitent une grande quantité d'espace mémoire continu. Les gros objets les plus typiques sont des chaînes très longues et des tableaux très longs. . Les objets volumineux sont une mauvaise nouvelle pour l'allocation de mémoire des machines virtuelles.L'apparition fréquente d'objets volumineux peut facilement déclencher un garbage collection à l'avance et générer un espace continu pour stocker des objets volumineux lorsqu'il y a encore beaucoup d'espace en mémoire. La pire situation avec les petits objets est de rencontrer un groupe de gros objets « de courte durée », ce qui devrait être évité lors de l'écriture de programmes.

  • Les objets survivants à long terme entrent dans l'ancienne génération
    Puisque la machine virtuelle adopte l'idée de collection générationnelle pour gérer la mémoire, la machine virtuelle a besoin de savoir quels objets doivent être placés dans le nouvelle génération et quels objets doivent être placés dans la nouvelle génération. Mettez-le dans la vieillesse. La machine virtuelle attribue à chaque objet un compteur d'âge. Si cet objet a subi un GC mineur dans la zone Eden et est stocké dans la zone des survivants, alors l'âge de cet objet est de 1. Chaque fois qu'il survit à un GC mineur, l'âge de l'objet augmente de 1. Lorsque son âge passe à un certain niveau (la valeur par défaut est de 15 ans), il sera promu à l'ancienne génération.

  • Détermination dynamique de l'âge des objets
    Afin de mieux s'adapter aux conditions de mémoire des différents programmes, la machine virtuelle n'autorise pas toujours l'entrée des objets uniquement lorsque l'âge de l'objet atteint un certain niveau. Dans l'ancienne génération, si la mémoire totale des objets du même âge dans l'espace survivant est supérieure à la moitié de la mémoire dans l'espace survivant, les objets supérieurs ou égaux à cet âge entreront dans l'ancienne génération.

  • Garantie d'allocation d'espace
    L'ancienne génération garantira l'allocation de mémoire de la nouvelle génération C'est-à-dire qu'avant d'effectuer un Minor GC, la machine virtuelle vérifiera d'abord le maximum continu. mémoire disponible de l'ancienne génération. L'espace est-il supérieur ou égal à l'espace total de tous les objets de la nouvelle génération ? S'il est supérieur ou égal à cela, cela signifie que le GC mineur est cette fois en sécurité, car après le Minor GC, les objets de nouvelle génération peuvent être stockés dans l'ancienne génération (lorsque l'espace survivant est perdu après le Minor GC Lorsque la mémoire n'est pas suffisante), si cette condition n'est pas vraie, la machine virtuelle vérifiera si le paramètre HandlePromotionFailure permet échec de garantie. Si cela est autorisé, la machine virtuelle vérifiera si l'espace disponible continu maximum dans l'ancienne génération est supérieur à la taille moyenne des objets qui ont été promus vers l'ancienne génération. Si elle est supérieure, la machine virtuelle tente de le faire. effectuer un GC mineur. Si l'échec de la garantie n'est pas autorisé, un GC complet (GC de l'ancienne génération) sera effectué pour récupérer l'espace des objets morts dans l'ancienne génération afin que l'ancienne génération puisse libérer plus d'espace.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer