8
votes

java.lang.outofMemoryError: Permgen Space dans le cadre de jeu

EDIT: - Play ~ Exécuter code> Pour exécuter mon projet

Comment supprimer ce problème, Mon projet est en phase de test. quotidiennement après 5-6 heures, il s'arrête soudainement et donnant l'erreur ci-dessous. Que faire pour supprimer cette erreur?
Je développe ce projet dans Scala 2.1 avec Playframework 2.2 P>

    java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
Caused by: java.lang.OutOfMemoryError: PermGen space
    at sun.misc.Unsafe.defineClass(Native Method)
    at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
    at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
    at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
    at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:113)
    at sun.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:331)
    at java.io.ObjectStreamClass.getSerializableConstructor(ObjectStreamClass.java:1376)
    at java.io.ObjectStreamClass.access$1500(ObjectStreamClass.java:72)
    at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:493)
    at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:468)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:468)
    at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:365)
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:602)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1706)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1344)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
[error] Total time: 11065 s, completed 8 Feb, 2014 6:12:52 PM
1. Waiting for source changes... (press enter to interrupt)

java.lang.OutOfMemoryError: PermGen space
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) java.lang.reflect.InvocationTargetException
[error] Total time: 4 s, completed 8 Feb, 2014 6:12:57 PM
2. Waiting for source changes... (press enter to interrupt)

java.lang.OutOfMemoryError: PermGen space
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) java.lang.reflect.InvocationTargetException
[error] Total time: 4 s, completed 8 Feb, 2014 6:13:08 PM
3. Waiting for source changes... (press enter to interrupt)

java.lang.OutOfMemoryError: PermGen space
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) java.lang.reflect.InvocationTargetException
[error] Total time: 6 s, completed 8 Feb, 2014 6:13:54 PM
4. Waiting for source changes... (press enter to interrupt)
[error] Expected letter
[error] Expected symbol
[error] Expected '!'
[error] Expected '+'
[error] Expected '++'
[error] Expected ';'
[error] Expected end of input.
[error] Expected 'show'
[error] Expected '*'
[error] Expected '{'
[error] Expected project ID
[error] Expected configuration
[error] Expected key
[error] 9000
[error] ^
sbt appears to be exiting abnormally.
  The log file for this session is at /tmp/sbt7580663022166474466.log
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-125" java.lang.OutOfMemoryError: PermGen space


4 commentaires

Je pense que vous devriez mentionner comment vous démarrez votre application: votre environnement (SBT, etc.) et la commande.


Ceci est un problème typique avec la recompilation dans une JVM en cours d'exécution. Vraisemblablement, vous testez et recompilez des cours de manière continue?


Si vous êtes dans la phase de test, vous devez exécuter votre code de la même manière qu'il fonctionnera dans la production, c'est-à-dire de manière non interactive. Vérifiez La documentation de la lecture sur la façon d'exécuter dans étape Mode, voire mieux, exécuté à partir du paquet autonome créé par la commande dist .


Si l'une des réponses fournies résout votre problème, veuillez l'accepter de fermer le problème. Merci !


5 Réponses :


2
votes

Commencez par augmenter votre taille Gén Perm lorsque vous démarrez la JVM.

Profilez votre code et découvrez pourquoi Gen Perm est consommé.

Rechercher des collections qui ne relâchent jamais de références, des tâches profondément récursives, etc.


0 commentaires

3
votes

En général, cela signifie que vous n'avez pas donné assez de mémoire à votre JVM ou que vous avez une fuite de mémoire. Voyez comment les gens traitent de tels problèmes ici: Traiter avec "Java.lang.outofMemoryError : Permgen Space "Erreur ou recherche d'une erreur spécifique à la lecture:" Java.lang.outofMemoryError: Permgen ".

En regardant votre journal, j'ai remarqué que vous l'exécutez probablement à partir de SBT ou d'un autre outil de construction comme Maven ("en attente de changements de source ..."). Pour aider SBT à empêcher les fuites de mémoire, vous pouvez ajouter ces arguments lorsque vous le déjeunerez: xxx

notez la ligne de commande de la classe de déchargement de la classe. En général, j'ai remarqué que les applications exécutées dans SBT parviennent toujours à fuir leurs ressources, peu importe ce que vous faites, mais en production, cela ne se produit pas. Vous pouvez essayer de courir dans un mode JVM Forked pour aider SBT - voir SBT-Revolver Plugin pour Exemple. Si vous souhaitez vraiment savoir comment votre application consomme de la mémoire et si elle a des fuites de mémoire l'exécutant en dehors d'un outil de construction, c'est-à-dire le déployer au conteneur comme Tomcat ou d'exécuter un pot ou de quoi avez-vous. Vous pouvez joindre des outils tels que jconsole pour observer l'utilisation de la mémoire.


0 commentaires

2
votes

Votre code génère de nombreuses classes. Les classes sont stockées dans l'espace Permgen et ne sont jamais recueillies (avant Java 8). Vous pouvez augmenter votre espace Permgen à l'aide de l'option -xxmaxpermsize lorsque vous exécutez la JVM, par exemple: xxx

à l'aide de -xmx ou < Code> -XMS (espace de tas) Ne fonctionne pas car il s'agit d'un espace différent.

Vous pouvez également utiliser un JVM Java 8 car il n'utilise plus PermanGenmore.


1 commentaires

Les choses que vous dites sur Java 8 sont également vraies pour Java 7



-1
votes

Vous pouvez utiliser jconsole.exe, qui fait partie de JDK, pour voir la tendance, comment la taille de la permène augmente. Peut-être que cela augmente à certains intervalles de temps, il vous sera donc plus facile de déboguer. Essayez également d'augmenter la taille de la Permgen: augmenter l'espace Permgen . Mais si le problème est en code, cela ne vous aidera pas pendant une longue période ...


0 commentaires

9
votes

J'ai eu le même problème, donc j'ai exporté le sbt_opts comme suit: xxx


3 commentaires

Je ne pense plus que cela fonctionne plus. Je reçois un avertissement d'hotspot sur les options permsize et maxpermsize ayant été supprimé dans la version 8.0.


Je ne suis pas sûre de ça. Quand j'ai posté cette version 8.0 n'était pas sorti.


Si vous descendez, avez-vous au moins le courage de dire pourquoi est-ce faux!