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 ?
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 ?
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).
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 :)
Si vous êtes sûr qu'il y a pas de fuites de mémoire dans votre programme, essayez de:
-Xmx1g
. -XX:+UseConcMarkSweepGC
. 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.
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
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...
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 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.