Préface
Comprenons d'abord la composition du tas Java. Pour la plupart des applications, le Java Heap est la plus grande mémoire gérée par le verrou de machine virtuelle Java. Le tas Java est une zone de mémoire partagée par tous les threads et est créé au démarrage de la machine virtuelle. Le seul but de cette zone de mémoire est de stocker des instances d'objet. Presque toutes les instances d'objet allouent de la mémoire ici
La structure du tas est la suivante
: le rapport de division spécifique de la nouvelle génération et de l'ancienne génération est le suivant
: la fonction principale de la génération est de gérer plus efficacement la mémoire.
La fuite de mémoire et le débordement de mémoire sont deux concepts différents
Fuite de mémoire: l'objet n'est plus utilisé, mais occupe toujours de l'espace mémoire et n'a pas été libéré.
Débordement de mémoire: l'espace du tas n'est pas suffisant, généralement exprimé par OutOfMemoryError, une fuite de mémoire entraîne généralement un débordement de mémoire
Utilisez Java VisualVM pour analyser à distance le tas
Nous pouvons analyser l'utilisation du tas grâce à la commande jvisualvm fournie avec jdk
Écrivons un programme pour montrer la scène de l'augmentation de la mémoire
public class OomDemo {
private static final int NUM = 1024;
public static void main(String[] args) throws InterruptedException {
List<byte[]> list = Lists.newArrayList();
for (int i = 0; i < NUM; i++) {
TimeUnit.SECONDS.sleep(1);
list.add(new byte[NUM * NUM]);
}
}
}
Exécutez jvisualvm dans la ligne de commande pour faire apparaître une interface graphique. Nous pouvons nous connecter au programme sur la machine, nous connecter à une machine distante, et analyser et générer des fichiers instantanés.
Vous pouvez clairement voir que l'espace du tas augmente. Utilisez un échantillonneur pour analyser la source de la mémoire croissante.
Bon gars, le tableau d'octets prend en fait tellement de mémoire
Si vous ne pouvez toujours pas voir où il y a un problème avec le programme à ce moment, cliquez sur le bouton de vidage du tas pour surveiller l'onglet, un instantané du tas sera généré, puis analysez le fichier de vidage.
Il existe peu d'instances de tableaux d'octets, mais elles prennent beaucoup de mémoire. Regardez les références spécifiques et
vous pouvez les voir dans ArrayList.
Enfin, je recommande un plug-in Visual GC, qui peut clairement voir l'utilisation du tas et collecter les informations de garbage.
Cliquez sur l'outil pour sélectionner le plug-in
Bien sûr, vous pouvez générer un fichier heapdump via la commande jmap, puis utiliser d'autres outils pour analyser
Outils de surveillance et de dépannage des performances des machines virtuelles Java
Java fournit de nombreuses commandes pratiques pour analyser l'état de la machine virtuelle Java, telles que les commandes suivantes
jps: liste les processus de machine virtuelle en cours d'exécution et affiche la classe principale d'exécution de la machine virtuelle
cis@mt002:~$ jps
70208 KmpService
183525 LinkAnalysisServer
25160 MipSerachServer
jmap (Memory Map for Java): la commande est utilisée pour générer des instantanés de vidage de tas (généralement appelés fichiers de vidage de tas ou fichiers de vidage)
Configurez les paramètres suivants dans la commande de démarrage pour générer un instantané au MOO, ce qui est pratique pour notre analyse
-XX:+HeapDumpOnOutOfMemoryError
jstack (Stack Trace for Java): outil de trace de pile Java pour générer un instantané de thread de la machine virtuelle au moment actuel
Peut être utilisé pour analyser le blocage de thread, la boucle infinie, le thread en attente depuis longtemps
Blog de référence
[1] https://blog.csdn.net/qq_35190492/article/details/105376377
plusieurs raisons du débordement brut
[2] https://blog.csdn.net/cp_panda_5/article/details/79613870