2009-03-23 7 views
27

Toutes les 15-30 minutes Netbeans affiche un "java.lang.OutOfMemoryError: PermGen space". D'après ce que j'ai appris de Google, cela semble être lié à des fuites de classloader ou à des fuites de mémoire en général.Comment puis-je empêcher les erreurs d'espace PermGen dans NetBeans?

Malheureusement, toutes les suggestions que j'ai trouvées étaient liées aux serveurs d'applications et je n'ai aucune idée de les adapter à Netbeans. (Je ne suis même pas sûr que c'est le même problème)

Est-ce un problème dans mon application? Comment puis-je trouver la source?

+0

voir aussi http://stackoverflow.com/questions/717550/java-lang-outofmemoryerror-java-heap-space-with-netbeans – Steen

+0

Pourquoi ne pas mettre à niveau vers une version plus récente de NetBeans? 6.5 est vraiment vieux. –

+4

@a_horse_with_no_name: Comme c'est cette question. Je l'ai demandé il y a plus de trois ans. –

Répondre

32

Il est à cause de la charge constante de classe.

Java stocke le code octet de classe et toutes les constantes (par exemple les constantes de chaîne) dans le tas permanent qui n'est pas récupéré par défaut (ce qui est logique dans la plupart des cas).

Dans les applications qui se chargent souvent des classes au cours d'une vie entière qui sont:

  • serveurs Web et d'applications pendant le redéploiement à chaud; IDE lors de l'exécution d'applications développées (chaque fois que vous cliquez sur le bouton Exécuter dans Netbeans ou Eclipse, les classes de votre application sont remplacées);
  • etc ce comportement est incorrect car un tas remplit finalement complet.

Vous devez activer la récupération de place permanente pour éviter cette erreur.

J'utilise les options

-XX:MaxPermSize=256M 
-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 

(arrêté mon éclipse 3.4 de jeter "java.lang.OutOfMemoryError: PermGen space" il devrait aussi travailler avec NetBeans).

Modifier: note juste que pour Netbeans vous définissez ces options: [Netbeans installation]\etc\netbeans.conf Vous devriez préfixé ces options avec -J et les ajouter à netbeans_default_options (voir les commentaires à netbeans.conf pour plus d'informations).

+0

OK, aucune des réponses vraiment aidé, mais celui-ci m'a acheté le plus de temps entre les redémarrages :) –

+0

essayez d'agrandir MaxPermSize à 512M ou plus de collecte des ordures beacuse hep ne sera toujours pas utile si une application lie pour stocker là plus que ça peut contenir (la quantité d'objets permamanet vivants dépasse la capacité de tas de permament) –

+1

Les arguments semblaient fonctionner pour moi (analyse de code de byte de rt.jar dans mon cas), cependant, j'ai reçu l'avertissement 'Please using CMSClassUnloadingEnabled au lieu de CMSPermGenSweepingEnabled dans le futur ». Toujours travaillé cependant. – Grundlefleck

2

Voir ce link sur la façon de définir la taille de PermSize. Très probablement ce n'est pas un problème de votre code, donc la seule solution serait d'augmenter le PermSize. J'ai trouvé que c'est assez souvent, quand vous travaillez avec JAXB. En général, si vous utilisez plusieurs bibliothèques qui dépendent elles-mêmes de nombreux autres fichiers jar, la taille par défaut de l'espace PermGen peut ne pas être assez grande.

Voir ces messages de blog pour plus de détails: Classloader leaks et How to fix the dreaded "java.lang.OutOfMemoryError: PermGen space"

1

Vous pouvez modifier les options de démarrage de NetBeans machine virtuelle Java en éditant le fichier /etc/netbeans.conf. J'ai souvent ce genre d'erreur quand je développe une Webapp et que je la déploie souvent. Dans ce cas, je redémarre tomcat de temps en temps.

4

Essayez d'ajouter l'argument suivant à NetBeans netconf: -J-XX: MaxPermSize = 256m

2

Si vous développez une application Web, essayez de mettre sur le serveur option vm

-Xmx512m -Xms512m -XX: MaxPermSize = 512m

Allez dans Outils/Serveurs // Plate-forme/VM Options (Netbeans 7.4)