940 votes

Erreur java.lang.OutOfMemoryError : limite supérieur GC dépassée

J’obtiens ce message d’erreur que j’ai exécuter mes tests JUnit :

Je sais qu’un `` est, mais que signifie GC overhead limite moyenne ? Comment est-ce que je peux résoudre ceci ?

854voto

Joachim Sauer Points 133411

Ce message signifie que, pour une raison quelconque, le garbage collector est de prendre une quantité excessive de temps (par défaut 98% de tous les temps CPU du processus) et récupère très peu de mémoire dans chaque course (par défaut 2% de la masse).

Cela signifie que le programme cesse de faire le moindre progrès et est occupé à courir uniquement à la collecte des ordures à tous les temps.

Pour éviter que votre demande de s'imprégner de temps CPU sans rien faire, la JVM jette cette Error , de sorte que vous avez une chance de diagnostiquer le problème.

Les rares cas où j'ai vu cela se produire est là qu'une partie du code a été la création des tonnes d'objets temporaires et des tonnes de faiblement les objets référencés dans un marché déjà très limité en mémoire de l'environnement.

Consultez cet article pour plus de détails (spécialement cette partie).

247voto

dave Points 3059

Le GC lève cette exception lorsque trop de temps est passé dans la collecte des ordures pour trop peu de retour, par exemple. 98% de temps PROCESSEUR est passé sur GC et moins de 2% de segment de mémoire est récupérée.

Cette fonctionnalité est conçue pour empêcher les applications de s'exécuter pendant une longue période de temps tout en faisant peu ou pas de progrès, parce que le tas est trop petit.

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

Plus d'infos ici

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

107voto

Vitalii Fedorenko Points 17469

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

  1. Augmenter la taille du tas, par exemple -Xmx1g.
  2. Activer la concurrente de faible pause collecteur -XX:+UseConcMarkSweepGC.
  3. La réutilisation des objets existants lorsque cela est possible pour économiser de la mémoire.

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

55voto

Mike Points 428

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");
    }
}

À l'aide de java 1.6.0_24-b07 Sur un Windows7 32 bits.

java -Xloggc:gc.journal GarbageCollector

Ensuite, regardez gc.journal

  • Déclenché 444 fois à l'aide d'une MAUVAISE méthode
  • Déclenché 666 fois à l'aide de PIRE méthode
  • Déclenché 354 fois à l'aide d'une MEILLEURE méthode

Je vous l'accorde, ce n'est pas le meilleur test ou le meilleur design, mais lorsqu'ils sont confrontés à une situation où vous n'avez pas le choix, mais la mise en œuvre de telle boucle ou lorsque vous traitez avec du code existant qui se comporte mal, le choix de la réutilisation d'objets au lieu de créer de nouveaux peut réduire le nombre de fois que le garbage collector est dans la manière...

32voto

chopu Points 105

J’avais rencontré le même problème

Exception in thread « main » java.lang.OutOfMemoryError : limite supérieur GC dépassée

et quand j’ai essayé de corriger cette erreur il a montré la même erreur. Donc ne panique et augmentation de la juste taille un peu plus en définissant cette option

Run -> Run Configurations - > cliquez sur arguments -> à l’intérieur de la VM arguments type

XMS-pour limite minimale

Xmx-pour limite maximale

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X