Interviewer: Comment dépanner les fuites de mémoire et les débordements de mémoire?

Insérez la description de l'image ici

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
Insérez la description de l'image ici
: le rapport de division spécifique de la nouvelle génération et de l'ancienne génération est le suivant
Insérez la description de l'image ici
: 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]);
        }
    }
}

Insérez la description de l'image ici

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.
Insérez la description de l'image ici
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.

Insérez la description de l'image ici
Il existe peu d'instances de tableaux d'octets, mais elles prennent beaucoup de mémoire. Regardez les références spécifiques et
Insérez la description de l'image ici
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
Insérez la description de l'image ici

Insérez la description de l'image ici
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

Je suppose que tu aimes

Origine blog.csdn.net/zzti_erlie/article/details/114746000
conseillé
Classement