Exception in thread “main” java.lang.OutOfMemoryError: GC généraux limite dépassée
Je ne peux pas courir mon processus. Il donne à l'exception suivante: "l'Exception" in thread "main" java.lang.OutOfMemoryError: Java heap space"
java -Xms32m -Xmx516m FilteringSNP_genus
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
à java.util.Les tableaux de.copyOf(Tableaux.java:2882)
à java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
à java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515)
à java.lang.StringBuffer.append(StringBuffer.java:306)
à java.io.BufferedReader.readLine(BufferedReader.java:345)
à java.io.BufferedReader.readLine(BufferedReader.java:362)
au FilteringSNP_genus.principale(FilteringSNP_genus.java:65)
J'ai essayé différentes utilisation de la mémoire de configurations:
java -Xms32m -Xmx1024m FilteringSNP_genus
mais il n'a pas fonctionné, et l'augmentation de l'-XmxVALUE a donné un GC overheadlimit dépassé exception:
Exception in thread "main" java.lang.OutOfMemoryError: GC généraux limite dépassée
à java.lang.Chaîne de caractères.substring(Chaîne de caractères.java:1940)
à java.util.StringTokenizer.nextToken(StringTokenizer.java:335)
au FilteringSNP_genus.principale(FilteringSNP_genus.java:77)
Quelqu'un pourrait fournir des indices pour résoudre ce problème?
Grâce
- Quelques infos ce serait apprécier: la plupart du temps ce qui fait votre processus de le faire (c'est un "Hello world" qui a mal tourné ou est-il vraiment un système complexe qui peut avoir besoin de tout cela de mémoire)
- Pouvez-vous poster le code autour de FilteringSNP_genus.java:65
Vous devez vous connecter pour publier un commentaire.
Je hasarderais une supposition que vous êtes en train de lire à partir d'un fichier ou d'un support et à l'aide de readLine() pour des raisons de commodité, sans prendre en considération les conséquences. Essayez lecture dans un char[] tampon à la place.
Alternativement, vous êtes en train de lire les lignes et le stockage dur de référence dans la mémoire, de sorte que vous ne sera évidemment le lancer de la salle une fois que vous avez lu assez.
Comme pour la GC frais généraux d'erreur, selon un Oracle de la JVM de l'article:
"Le parallèle collecteur de jeter un OutOfMemoryError si trop de temps passé à la collecte des ordures: si plus de 98% du temps total passé dans la collecte des ordures et moins de 2% de la masse est récupéré, un OutOfMemoryError sera levée."
GC overhead error
!J'ai trouvé le GC si elle prend trop de temps à trouver de la mémoire, même si la mémoire est effectivement là. Le plus simple problème est lorsque la mémoire est la plupart du temps virtuel, ce qui est considérablement plus lent que la mémoire réelle. Aussi, si la mémoire est trop fragmenté, le GC peut prendre le temps de trouver l'espace dont il a besoin. Et si vous êtes l'allocation de gros morceaux de la mémoire, qui peut rendre la situation bien pire. Un problème de ce genre peut être intermittent, travail d'amende lorsque le GC a eu le temps de nettoyer la maison et de garder tout organisé et à défaut, lorsqu'il est surchargé. Ma conjecture est que dans votre cas, soit vous avez un problème de pagination ou vous utilisez trop de mémoire disponible dans les morceaux qui sont trop grandes.
Solutions: avoir plus de mémoire réelle (si la pagination est le problème). Utiliser moins de mémoire. Utiliser de plus petits morceaux de mémoire. Les tableaux sont le moyen le plus rapide pour échanger des chiffres, mais des structures de données avec des pointeurs rendre la vie plus facile pour la GC. Si vous pouvez trouver un moyen d'utiliser de plus petits ensembles (ou pas des tableaux), le faire.
Il devrait être possible pour obtenir un bon système 64 bits (de l'ordinateur et de la JVM) avec 8 GO ou plus de mémoire de sorte que vous pouvez l'ignorer et oublier ce problème, mais je n'ai pas encore d'entendre parler de quelqu'un de le faire. (Et l'utilisation de la mémoire s'agrandit pour remplir la mémoire disponible...)