Question Erreur java.lang.OutOfMemoryError: limite de surcharge du GC dépassée


Je reçois ce message d'erreur pendant que j'exécute mes tests JUnit:

java.lang.OutOfMemoryError: GC overhead limit exceeded

Je sais ce que OutOfMemoryError est, mais qu'est-ce que la limite de frais généraux de GC signifie? Comment puis-je resoudre ceci?


602
2017-09-08 11:34


origine


Réponses:


Ce message signifie que, pour une raison ou une autre, le garbage collector prend trop de temps (par défaut 98% du temps processeur du processus) et récupère très peu de mémoire à chaque exécution (par défaut 2% du tas).

Cela signifie que votre programme ne progresse plus et qu'il ne s'occupe que de la collecte des ordures à tout moment.

Pour empêcher votre application d'absorber le temps processeur sans rien faire, la JVM lance cette Error afin que vous ayez une chance de diagnostiquer le problème.

Les rares cas où j'ai vu cela se produire sont où un code créait des tonnes d'objets temporaires et des tonnes d'objets faiblement référencés dans un environnement déjà très limité en mémoire.

Check-out Cet article pour plus de détails cette partie).


614
2017-09-08 11:39



Le GC lance cette exception quand trop de temps est passé dans la récupération de place pour un retour trop faible, par exemple. 98% du temps CPU est passé sur GC et moins de 2% de tas est récupéré.

Cette fonctionnalité est conçue pour empêcher les applications de s'exécuter pendant une période prolongée tout en effectuant peu ou pas de progrès car le tas est trop petit.

Vous pouvez désactiver cela avec l'option de ligne de commande -XX:-UseGCOverheadLimit

Plus d'informations ici

EDIT: on dirait que quelqu'un peut taper plus vite que moi :)


165
2017-09-08 11:43



Si vous êtes sûr qu'il n'y a pas fuites de mémoire dans votre programme, essayez de:

  1. Augmentez la taille du tas, par exemple -Xmx1g.
  2. Activer le collecteur à faible pause simultanée -XX:+UseConcMarkSweepGC.
  3. Réutilisez les objets existants lorsque cela est possible pour économiser de la mémoire.

Si nécessaire, le vérification de limite peut être désactivé en ajoutant l'option -XX:-UseGCOverheadLimit à la ligne de commande.


76
2017-12-14 01:44



C'est généralement le code. Voici un exemple simple:

import java.util.*;

public class GarbageCollector {

    public static void main(String... args) {

        System.out.printf("Testing...%n");
        List<Double> list = new ArrayList<Double>();
        for (int outer = 0; outer < 10000; outer++) {

            // list = new ArrayList<Double>(10000); // BAD
            // list = new ArrayList<Double>(); // WORSE
            list.clear(); // BETTER

            for (int inner = 0; inner < 10000; inner++) {
                list.add(Math.random());
            }

            if (outer % 1000 == 0) {
                System.out.printf("Outer loop at %d%n", outer);
            }

        }
        System.out.printf("Done.%n");
    }
}

En utilisant java 1.6.0_24-b07 Sur un Windows7 32 bits.

java -Xloggc: gc.log GarbageCollector

Alors regardez gc.log

  • Déclenchée 444 fois avec la méthode BAD
  • Déclenchée 666 fois avec la méthode WORSE
  • Déclenchée 354 fois avec la méthode BETTER

Maintenant, ce n'est pas le meilleur test ou le meilleur design, mais face à une situation où vous n'avez pas d'autre choix que d'implémenter une telle boucle ou de manipuler du code existant qui se comporte mal, choisir de réutiliser des objets le nombre de fois que le ramasse-miettes se trouve sur le chemin ...


34
2018-04-12 19:27



Augmentez légèrement la taille du tas en définissant cette option dans

Exécuter → Exécuter les configurations → Arguments → Arguments de la machine virtuelle

-Xms1024M -Xmx2048M

Xms - pour la limite minimale

Xmx - pour la limite maximale


26
2018-05-13 10:40



Cause pour le Erreur

La limite de surcharge GC est dépassée "indique que le garbage collector est en cours d'exécution et que le programme Java progresse très lentement.

Après une collecte des ordures, si le Le processus Java consacre plus de 98% de son temps à la collecte des ordures et si elle récupère moins de 2% du tas et a fait jusqu'à présent les 5 dernières (constante de temps de compilation) des collections de garbage consécutives, puis un java.lang.OutOfMemoryError Est lancé

  1. Augmenter la taille du tas si le tas actuel n'est pas suffisant.
  2. Si vous obtenez toujours cette erreur après avoir augmenté la mémoire de tas, utilisez la mémoire outils de profilage comme TAPIS (Outil d'analyse de mémoire), Visual VM etc et réparer les fuites de mémoire.
  3. Mettez à niveau la version JDK vers la dernière version (1.8.x) ou au moins la version 1.7.x et utilisez l'algorithme G1GC. . L'objectif de débit du GC G1 est de 90% de temps d'application et de 10% de temps de collecte des ordures
  4. En dehors de la définition de mémoire de tas avec -Xms1g -Xmx2g , essayez

    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m  
    -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
    

Jetez un oeil à quelques questions plus connexes concernant G1GC

Java 7 (JDK 7) garbage collection et la documentation sur G1

Java G1 garbage collection en production

Article d'Oracle technetwork pour le réglage fin du GC


23
2018-02-06 18:06



Pour moi, les étapes suivantes ont fonctionné:

  1. Ouvrez le eclipse.ini fichier
  2. Changement

    -Xms40m
    -Xmx512m
    

    à

    -Xms512m
    -Xmx1024m
    
  3. Redémarrer Eclipse

Vois ici


12
2017-12-31 05:09



essaye ça

ouvre le build.gradle fichier

  android {
        dexOptions {
           javaMaxHeapSize = "4g"
        }
   }

12
2017-11-23 18:09



Ce qui suit a fonctionné pour moi. Ajoutez simplement l'extrait suivant:

android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'

defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
dexOptions {
        javaMaxHeapSize "4g"
    }
}

12
2017-12-27 11:47



augmentez javaMaxHeapsize dans votre fichier build.gradle (Module: app)

dexOptions {
    javaMaxHeapSize "1g"
}

à (Ajouter cette ligne en gradle)

 dexOptions {
        javaMaxHeapSize "4g"
    }

5
2018-04-07 12:27