2010-08-11 6 views
2

Récemment, tout en travaillant sur une application Web JSF, en utilisant NetBeans 6.8, je reçois constamment des erreurs PermGen: Out Of Memory. J'ai également remarqué que ceci n'est pas lié à l'échange à chaud du code, comme certaines personnes l'ont suggéré sur les forums; Je redémarre généralement mon serveur Web local, Tomcat 6.0, chaque fois que je redéploie le code. Cela m'arrivait de temps en temps, mais dernièrement, cela se produisait constamment. Je ne peux généralement pas dépasser deux minutes avant de tomber en panne.Netbeans Java Debugger plante avec des erreurs de mémoire insuffisante

L'observation importante que j'ai faite à propos de ce problème, c'est que cela semble seulement se produire lors de l'exécution du débogueur. Si je lance le serveur régulièrement, il fonctionnera indéfiniment. Dès que je cours en mode de débogage, ce problème se produit.

J'ai essayé tous les conseils que j'ai trouvé jusqu'ici pour augmenter les paramètres de mémoire JAVA_OPT pour Java dans Tomcat; J'ai essayé d'augmenter la mémoire disponible pour Netbeans dans netbeans.conf. Toujours pas de chance. Si vous voulez voir les changements de configuration spécifiques que j'ai faits, je peux aussi poster cela.

J'ai également lu que cela peut être le résultat de fuites de mémoire en Java. J'ai essayé d'exécuter le profileur de Netbean, mais il se bloque généralement avant que je puisse faire quelque chose de vraiment utile. De plus, quand elle s'est exécutée, toutes les allocations d'objets avec des générations ridicules étaient des choses dans les bibliothèques java, ou les primitives - char [] étaient le plus gros cochon de mémoire de l'application, par exemple, avec les plus grandes générations.

Je voudrais vraiment savoir si quelqu'un a déjà eu un problème similaire auparavant, et si oui, comment ils l'ont résolu. Cela commence à sérieusement nuire à ma capacité de faire mon travail.

Merci pour toute aide.

+0

Est-ce que netbeans.conf affiche ** - J-XX: PermSize = 32m -J-XX: MaxPermSize = 200m **? – JoseK

+0

J'avais cet ensemble précédemment à la même valeur, 1024m. J'ai changé à votre suggestion, le mettant à 256 et 512 respectivement. Maintenant, il se bloque différemment. Alors que ça avait l'habitude de sauter tout de suite avec l'erreur PermGen, maintenant ça bloque généralement, et parfois je reçois une erreur, et d'autres fois, ça raccroche indéfiniment. – Lee

+0

Vous auriez besoin d'une décharge de tas d'abord pour identifier les objets qui fuient et ceux qui les maintiennent en vie. Une fois que vous le savez, vous pouvez soit résoudre le problème immédiatement (si c'est assez simple et que vous connaissez le code où se trouve le coupable), soit utiliser le profileur pour localiser les endroits où les instances sont fuites. Vous pouvez utiliser jmap ou visualvm (jvisualvm) pour obtenir le vidage de tas. Pour l'analyse, vous pouvez aussi utiliser visualvm, mais bien sûr, vous pouvez choisir l'outil que vous voulez - par ex. MAT si vous voulez coller à des outils gratuits. –

Répondre

2

ajouter cette entrée dans catlina.sh (ou chauve-souris), il a travaillé pour moi

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
    -server -Xms1536m -Xmx1536m 
    -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=512m 
    -XX:MaxPermSize=512m -XX:+DisableExplicitGC 
+0

Merci, j'ai déconné avec ces paramètres dans Netbeans lors du débogage d'une application Tomcat jusqu'à ce que votre question a tout fait clic. Merci pour votre réponse. – Zoidberg

+0

@Zoidberg: très bienvenu .. –

0

Quelque chose que j'ai trouvé utile pour traquer les fuites de mémoire sans courir un profileur ou un débogueur est d'utiliser le « jmap -histo "(vient avec le jdk). Enregistrez la sortie de ce programme dans un fichier. Exécutez-le toutes les quelques minutes pendant que votre application est en cours d'exécution. Rassemblez les sorties et recherchez les objets dont le nombre et la taille augmentent constamment. J'ai même écrit une application rapide pour graver des objets sélectionnés au fil du temps afin de mettre en évidence les objets qui s'enfuient simplement pour faciliter la détection des fuites.

Questions connexes