Configurer les paramètres de la machine virtuelle en cas de dépassement de mémoire d'idée et de machine virtuelle

Débordement de tas Java

Le tas Java est utilisé pour stocker les instances d'objet. Si le nombre d'objets augmente jusqu'à la capacité maximale du tas, un débordement de mémoire se produit.

La valeur minimale du tas-Xms La valeur maximale du tas-Xmx

Idée configurer les paramètres de la machine virtuelle

idée
Définir les paramètres de la machine virtuelle

    static class OOMObject
    {
    
    

    }

    public static void main(String[] args)
    {
    
    
        List<OOMObject> list = new ArrayList<>();
        while (true)
        {
    
    
            list.add(new OOMObject());
        }
    }

résultat de l'opération

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid16012.hprof ...
Heap dump file created [29135766 bytes in 0.072 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3210)
	at java.util.Arrays.copyOf(Arrays.java:3181)
	at java.util.ArrayList.grow(ArrayList.java:265)
	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
	at java.util.ArrayList.add(ArrayList.java:462)
	at Scratch.main(scratch.java:44)

Pile de machine virtuelle et débordement de pile de méthodes locales

Le paramètre -Xss modifie la capacité de la pile.

  1. Si la profondeur de pile demandée par le thread est supérieure à la profondeur maximale autorisée par la machine virtuelle, une exception "StackOverflowError" sera levée.
  2. Si la mémoire de la pile de machines virtuelles permet une expansion dynamique, lorsque la capacité de la pile d'extension ne peut pas s'appliquer à suffisamment de mémoire, une exception OutOfMemoryError est levée.

Zone de méthode et débordement de pool constant à l'exécution

Le pool de constantes d'exécution fait partie de la zone de méthode.
Les paramètres de la machine virtuelle -XX: PermSize, -XX: MaxPermSize limitent la taille de la génération permanente.
Dans les machines virtuelles HotSpot JDK6 et antérieures, le pool de constantes est alloué dans la génération permanente et le pool de constantes de JDK7 et supérieur est alloué dans le tas Java. Ainsi, avant JDK6, en limitant la taille de la génération permanente, la machine virtuelle peut lever une exception OutOfMemoryError.Après JDK7, l'espace du tas doit être limité.
String :: intern () : Si le pool de constantes de chaîne contient déjà une chaîne égale à cet objet String, il renvoie une référence à l'objet String représentant la chaîne dans le pool; sinon, il retournera les caractères contenus dans cet objet String La chaîne est ajoutée au pool de constantes et une référence à cet objet String est renvoyée.

 public static void main(String[] args)
    {
    
    
        String str1 = new StringBuilder("计算机").append("网络工程").toString();
        System.out.println(str1.intern() == str1);

        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern() == str2);
    }
返回结果:
JDK7及以上
true
false
JDK6
false
false

Raison: Dans JDK6, la chaîne rencontrée pour la première fois sera stockée dans la génération permanente, et le retour est une référence dans la génération permanente, et StringBuilder est un objet créé dans le tas Java, donc ce n'est pas une référence.
Le pool de constantes JDK7 ou supérieur a été déplacé vers le tas Java. Il vous suffit d'enregistrer la première occurrence de l'instance de référence, donc la référence renvoyée par intern () et l'instance de chaîne créée par StringBuilder sont utilisées. str2 renvoie false car les caractères java ne sont pas rencontrés pour la première fois (chargés dans le pool de constantes lors du chargement de la classe sun.misc.Version).
Après JDK8, la méta-espace remplace la génération permanente.
Le paramètre -XX: MaxMetaspaceSize définit la valeur maximale de la métaspace. La valeur par défaut est -1, ce qui signifie qu'il n'y a pas de limite, uniquement limitée à la mémoire locale.
-XX: MetaspaceSize: spécifiez la taille initiale de la métaspace, en octets. Lorsque cette valeur est atteinte, le garbage collection sera déclenché pour le déchargement de type et le collecteur ajustera la valeur. Si une grande quantité d'espace est libérée, la valeur doit être abaissée de manière appropriée, et si une petite quantité d'espace est libérée, elle peut être réduite de manière appropriée.
-XX: MinMetaspaceFreeRatio: La fonction est de contrôler le pourcentage de la capacité restante de la plus petite métaspace après le garbage collection, ce qui peut réduire la fréquence du garbage collection en raison d'une métaspace insuffisante.

Débordement de mémoire direct natif

La mémoire directe est spécifiée par -XX: ManDirectMemorySize. Ne spécifiez pas toujours la mémoire par défaut et le tas (-Xmx)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43663421/article/details/109323425
conseillé
Classement