Je reçois ce message d'erreur lorsque j'exécute mes tests JUnit:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Je sais ce qu'est un OutOfMemoryError
, mais que signifie la limite de frais généraux du GC? Comment puis-je resoudre ceci?
Je reçois ce message d'erreur lorsque j'exécute mes tests JUnit:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Je sais ce qu'est un OutOfMemoryError
, mais que signifie la limite de frais généraux du GC? Comment puis-je resoudre ceci?
OutOfMemoryError
scénarios pour lesquels l'augmentation du tas n'est pas une solution valide: manquer de threads natifs et manquer de perm gen (qui est distinct du tas) en sont deux exemples. Soyez prudent lorsque vous faites des déclarations trop larges surOutOfMemoryErrors
; il y a un ensemble diversifié de choses qui peuvent les provoquer.Réponses:
Ce message signifie que pour une raison quelconque, le garbage collector prend trop de temps (par défaut 98% de tout le temps CPU du processus) et récupère très peu de mémoire à chaque exécution (par défaut 2% du tas).
Cela signifie effectivement que votre programme cesse de faire des progrès et est occupé à exécuter uniquement la récupération de place à tout moment.
Pour empêcher votre application d'absorber le temps CPU sans rien faire, la JVM le lance
Error
afin que vous ayez une chance de diagnostiquer le problème.Les rares cas où j'ai vu cela se produire sont ceux où du 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.
Consultez le guide de réglage Java GC, qui est disponible pour différentes versions de Java et contient des sections sur ce problème spécifique:
la source
Citation de l'article d'Oracle "Java SE 6 HotSpot [tm] Virtual Machine Garbage Collection Tuning" :
EDIT: on dirait que quelqu'un peut taper plus vite que moi :)
la source
-XX:
début de plusieurs options de ligne de commande est un indicateur de type indiquant que cette option est hautement spécifique à la VM et instable (sujet à changement sans préavis dans les futures versions). Dans tous les cas, l'-XX:-UseGCOverheadLimit
indicateur indique à la machine virtuelle de désactiver la vérification de la limite de surcharge du GC (en fait "l'éteint"), tandis que votre-Xmx
commande a simplement augmenté le tas. Dans ce dernier cas, la vérification des frais généraux du GC était toujours en cours d'exécution , cela ressemble à un tas plus important qui a résolu les problèmes de contournement du GC dans votre cas (cela n'aidera pas toujours).Si vous êtes sûr qu'il n'y a aucune fuite de mémoire dans votre programme, essayez de:
-Xmx1g
.-XX:+UseConcMarkSweepGC
.Si nécessaire, la vérification des limites peut être désactivée en ajoutant l'option
-XX:-UseGCOverheadLimit
à la ligne de commande.la source
List
objet à l'intérieur de la boucle a fait appeler GC 39 fois au lieu de 22 fois.C'est généralement le code. Voici un exemple simple:
Utilisation de Java 1.6.0_24-b07 sur Windows 7 32 bits.
Regardez ensuite
gc.log
Maintenant accordé, ce n'est pas le meilleur test ou la meilleure conception, mais face à une situation où vous n'avez pas d'autre choix que d'implémenter une telle boucle ou lorsque vous traitez avec du code existant qui se comporte mal, choisir de réutiliser des objets au lieu d'en créer de nouveaux peut réduire le nombre de fois où le ramasse-miettes gêne ...
la source
gc.log
fichier. Mes tests montrent beaucoup moins de temps dans l'ensemble, mais le moins de temps «déclencheurs» pour MIEUX, et maintenant, MAUVAIS est «plus mauvais» que PIRE maintenant. Mes comptes: MAUVAIS: 26, PIRE: 22, MIEUX 21.List<Double> list
dans la boucle externe au lieu d' avant la boucle externe, et j'ai déclenché 39 garbage collections.Cause de l'erreur selon la plate-forme Java [8], Guide de dépannage de l'édition standard : (accentuation et sauts de ligne ajoutés)
En plus de définir la mémoire de tas avec -
Xms1g -Xmx2g
, essayezJetez un oeil à quelques questions plus connexes concernant G1GC
Collecte des ordures et documentation Java 7 (JDK 7) sur G1
Collecte des ordures Java G1 en production
Article sur Oracle Technetwork pour le réglage fin du GC
la source
Augmentez un peu la taille du tas en définissant cette option dans
Exécuter → Configurations d'exécution → Arguments → Arguments de machine virtuelle
Xms - pour la limite minimale
Xmx - pour la limite maximale
la source
arguments
onglet ... que devons-nous faire pour y parvenir?Pour moi, les étapes suivantes ont fonctionné:
eclipse.ini
dossierChangement
à
Redémarrez Eclipse
Vois ici
la source
essaye ça
ouvrir le
build.gradle
dossierla source
Ce qui suit a fonctionné pour moi. Ajoutez simplement l'extrait suivant:
la source
augmentez javaMaxHeapsize dans votre fichier build.gradle (Module: app)
à (ajouter cette ligne en gradle)
la source
Description des tailles de tas Java (xms, xmx, xmn)
Définit la taille initiale du tas Java. La taille par défaut est 2097152 (2 Mo). Les valeurs doivent être un multiple de et supérieur à 1024 octets (1 Ko). (L'indicateur -server augmente la taille par défaut à 32 Mo.)
Définit la taille initiale du tas Java pour la génération Eden. La valeur par défaut est 640K. (L'indicateur -server augmente la taille par défaut à 2 Mo.)
Définit la taille maximale à laquelle le tas Java peut s'agrandir. La taille par défaut est 64M. (L'indicateur -server augmente la taille par défaut à 128 Mo.) La limite de segment de mémoire maximale est d'environ 2 Go (2048 Mo).
Formatage des arguments de mémoire Java (xms, xmx, xmn)
Lors de la définition de la taille du segment Java, vous devez spécifier votre argument mémoire en utilisant l'une des lettres «m» ou «M» pour MB, ou «g» ou «G» pour GB. Votre paramètre ne fonctionnera pas si vous spécifiez «Mo» ou «Go». Les arguments valides ressemblent à ceci:
-Xms64m ou -Xms64M -Xmx1g ou -Xmx1G Peut également utiliser 2048 Mo pour spécifier 2 Go. Veillez également à n'utiliser que des nombres entiers lors de la spécification de vos arguments. L'utilisation de -Xmx512m est une option valide, mais -Xmx0.5g provoquera une erreur.
Cette référence peut être utile à quelqu'un.
la source
Vous pouvez également augmenter l'allocation de mémoire et la taille du segment de mémoire en l'ajoutant à votre
gradle.properties
fichier:org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
Il ne doit pas nécessairement être 2048M et 32g, rendez-le aussi grand que vous le souhaitez.
la source
Résolu:
Il suffit d' ajouter
org.gradle.jvmargs=-Xmx1024m
dans
gradle.properties
et si elle n'existe pas, créez - le.
la source
Je travaille dans Android Studio et j'ai rencontré cette erreur lors de la tentative de génération d'un APK signé pour publication. J'ai pu créer et tester un APK de débogage sans problème, mais dès que je voulais créer un APK de version, le processus de construction s'exécutait pendant des minutes, puis se terminait finalement par l'erreur "java.lang.OutOfMemoryError: GC dépassement de la limite de frais généraux ". J'ai augmenté les tailles de tas pour la machine virtuelle et le compilateur Android DEX, mais le problème persistait. Enfin, après de nombreuses heures et des tasses de café, il s'est avéré que le problème se trouvait dans mon fichier 'build.gradle' au niveau de l'application - j'avais le paramètre 'minifyEnabled' pour le type de build de la version réglé sur 'false', exécutant par conséquent des trucs Proguard sur du code qui n'a pas subi le processus de réduction de code (voir https://developer.android.). J'ai changé le paramètre 'minifyEnabled' en 'true' et la build de la version exécutée comme un rêve :)
En bref, j'ai dû changer mon fichier 'build.gradle' au niveau de l'application de: // ...
à
la source
Pour augmenter la taille du segment de mémoire dans IntelliJ IDEA, suivez les instructions suivantes. Ça a marché pour moi.
Pour les utilisateurs de Windows,
Accédez à l'emplacement où IDE est installé et recherchez les éléments suivants.
Modifiez le fichier et ajoutez ce qui suit.
C'est ça !!
la source
vous pouvez essayer d'apporter des modifications au paramètre du serveur en vous référant à cette image et augmenter la taille de la mémoire pour le traitement des modifications du processus surlignées en jaune
vous pouvez également apporter des modifications au tas java en ouvrant cmd->
set _java_opts -Xmx2g
2g (2gigabytes) selon la complexité de votre programme
essayez d'utiliser des variables variables et temporaires moins constantes
la source
Vous devez augmenter la taille de la mémoire dans Jdeveloper, accédez à setDomainEnv.cmd .
et
la source
Dans Netbeans, il peut être utile de concevoir une taille de segment de mémoire maximale. Accédez à Exécuter => Définir la configuration du projet => Personnaliser . Dans la fenêtre Exécuter de sa fenêtre contextuelle, accédez à Option VM , remplissez
-Xms2048m -Xmx2048m
. Cela pourrait résoudre le problème de taille de tas.la source
Le redémarrage de mon MacBook a résolu ce problème pour moi.
la source
Je ne sais pas si cela est toujours pertinent ou non, mais je veux juste partager ce qui a fonctionné pour moi.
Mettre à jour la version kotlin vers la dernière version disponible. https://blog.jetbrains.com/kotlin/category/releases/
et c'est fait.
la source