web-dev-qa-db-fra.com

java.lang.OutOfMemoryError: espace PermGen

Je reçois fréquemment des erreurs de suivi dans Eclipse IDE 3.2, comment pourrais-je enregistrer l'application à partir de ces OutOfMemory?

Java.lang.OutOfMemoryError: PermGen space
    Java.lang.ClassLoader.defineClass1(Native Method)
    Java.lang.ClassLoader.defineClassCond(Unknown Source)
    Java.lang.ClassLoader.defineClass(Unknown Source)
    Java.security.SecureClassLoader.defineClass(Unknown Source)
    org.Apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.Java:1814)
    org.Apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.Java:872)
    org.jboss.web.Tomcat.service.WebAppClassLoader.findClass(WebAppClassLoader.Java:75)
    org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1325)
    org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1204)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.Java:289)
    Java.sql.DriverManager.getConnection(Unknown Source)
    Java.sql.DriverManager.getConnection(Unknown Source)
    org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.Java:133)
    org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.Java:111)
    org.hibernate.cfg.Configuration.buildSettings(Configuration.Java:2101)
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1325)
    com.mfic.util.HibernateUtil.<clinit>(HibernateUtil.Java:16)
    com.mfic.dao.BaseHome.getSession(BaseHome.Java:16)
    com.mfic.core.helper.UserManager.findByUserId(UserManager.Java:248)
    com.mfic.core.action.Login.authenticate(Login.Java:39)
    Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    Java.lang.reflect.Method.invoke(Unknown Source)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.Java:441)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.Java:280)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.Java:243)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.Java:165)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.Java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.Java:237)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.Java:252)
    org.Apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.Java:68)
33
Ganesamoorthy

Si vous obtenez l'erreur interrogée dans l'application Eclipse secondaire, ajoutez -XX:MaxPermSize=512m dans ini n'aidera pas. Vous devez entrer dans debug or run configuration->arguments et ajoutez cette pièce dans les arguments VM. J'ai également augmenté les limites de mémoire des autres afin:

-Dosgi.requiredJavaVersion=1.5 -Xms120m -Xmx2048m -XX:MaxPermSize=1024m

Ça m'a aidé.

Modifier. Après quelques expériences que j'ai trouvées, Eclipse prend les limites de mémoire du fichier ini. Mais ... il ne le fait qu'une seule fois, lors de la création d'un nouvel espace de travail. Les paramètres de -vmarg dans Eclipse.ini créent la ligne de paramètres par défaut VM. Donc, si vous travaillez sur l'espace de travail existant, changez le débogage ou exécutez la configuration. Mais changez Eclipse.ini également pour Meilleur futur.

36
Gangnus

Votre projet mange beaucoup de mémoire. Donnez à Eclipse plus de mémoire pour travailler avec. Modifier Eclipse.ini pour modifier ou ajouter les lignes suivantes sous -vmargs.

 - Xms256m 
 - Xmx512m 
 - XX: MaxPermSize = 512m 

En supposant que vous avez au moins 2 Go de RAM.

Voir également:

20
BalusC
  • Cliquez sur instance de serveur.
  • Ouvrez les configurations de lancement.
  • Augmentez la mémoire en JVM, dans l'onglet Argument.

-Xms64m -Xmx256m

Voir les images ci-dessous:

enter image description here

19
Chand Priyankara

Les applications Java ne sont autorisées à utiliser qu'une quantité limitée de mémoire. La quantité exacte de mémoire que votre application particulière peut utiliser est spécifiée lors du démarrage de l'application. Pour rendre les choses plus complexes, la mémoire Java Java est séparée en différentes régions, dont l'une est appelée PermGen.

La taille de toutes ces régions est définie lors du lancement de la JVM. Si vous ne définissez pas explicitement les tailles, des valeurs par défaut spécifiques à la plate-forme seront utilisées.

Alors le Java.lang.OutOfMemoryError: PermGen space le message indique que la zone de taille permanente en mémoire est épuisée.

Cette zone spécifique appelée PemGen est une région dédiée où Java sont chargées et stockées. Elle se compose des éléments suivants:

  • Noms des classes
  • Domaines de la classe
  • Méthodes d'une classe avec le bytecode des méthodes
  • Informations constantes sur la piscine
  • Tableaux d'objets et tableaux de types associés à une classe
  • Optimisations du compilateur Just In Time

C'est à peu près tout. Quelques morceaux de plus, mais cela n'affecte pas la consommation de mémoire réelle de plus de quelques pour cent. Tous ces éléments sont attribués à la génération permanente et restent dans la génération permanente.

Comme vous pouvez le voir, les exigences de taille de génération permanente dépendent à la fois du nombre de classes chargées ainsi que de la taille de ces déclarations de classe. Il est donc facile de voir la cause principale d'une telle erreur: soit trop de classes ou des classes trop grandes sont chargées dans la génération permanente.

La correction rapide des symptômes est facile - si nous avons épuisé la zone PermGen dans le tas, nous devons augmenter sa taille. Cette solution est en effet utile si vous n'avez tout simplement pas donné suffisamment de place aux coudes à votre JVM. Modifiez donc la configuration de lancement de votre application et ajoutez (ou augmentez, le cas échéant) les éléments suivants:

-XX:MaxPermSize=512m
5
Ivo

Cela se produit assez fréquemment lors de l'exécution de Tomcat dans Eclipse pendant les sessions de débogage, etc. De la mémoire, c'est un problème avec la JVM Sun. Annnyway, il existe une solution simple:

Ajoutez simplement ce qui suit sous votre -vmargs dans Eclipse.ini (qui se trouve dans le même répertoire que votre binaire Eclipse):

-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled 

Cela permettra une récupération de place plus agressive lors de l'exécution d'Eclipse, et est une solution plus élégante que de simplement lancer plus RAM sur Eclipse.

J'espère que cela t'aides!

2
Sam Day

Les réponses ci-dessus le résolvent probablement pour vous, mais voici quand même quelques liens pertinents intéressants:

Voici un article avec beaucoup de discussions et de suggestions sur cette erreur: http://www.jroller.com/agileanswers/entry/preventing_Java_s_Java_lang

Discussion d'un exemple de la façon dont une erreur de MOO Permgen peut se produire: http://blogs.Oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_Java

Voici une solution réelle, publiée récemment sur StackOverflow. C'est pour Tomcat mais peut être utilisable dans Eclipse: Traitement de l'erreur "Java.lang.OutOfMemoryError: PermGen space"

2
Beel

Et aussi après avoir essayé les options ci-dessus, veuillez vérifier avec la JVM mise à jour. J'utilisais jdk1.6 et faisais face au même problème. Lorsque j'ai changé le jvm dans Eclipse en JDK1.7, cela fonctionne bien.

1
Anand Kumar

Augmentez votre MaxPermSize dans votre Eclipse.ini. Je suggère de le régler à 128M ou 256M si vous êtes à l'aise avec la RAM

-vmargs -XX:PermSize=64M -XX:MaxPermSize=128M  

Notez également que de nombreuses personnes ont rencontré des problèmes avec PermGen avec Eclipse 3.2, comme indiqué dans Perm-Gen Errors Got You Down? . Et comme Eclipse 3.2 a plus de 4 ans, je suggère de passer à une version plus récente (Eclipse 3.6 est la version actuelle).

Les références

1
Pascal Thivent