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)
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.
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 les images ci-dessous:
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:
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
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!
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"
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.
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).