2010-08-19 12 views
2

Lors de l'exécution d'une application Java EE sur un jvm 32 bits sous Solaris x86, j'obtiens une OutOfMemoryError: Impossible de créer un thread natif (ou quelque chose comme ça). C'est parce que jvm n'a pas assez de mémoire pour la pile du nouveau thread autant que je le comprends. J'utilise à la fois JConsole et VisualVM 1.3 pour surveiller l'application mais je ne sais pas ce que "stackmemory" est appelé dans ces outils. Dans VisualVM, je peux surveiller l'espace heapspace et permgen tandis que JConsole montre quelques zones de mémoire supplémentaires. L'une de ces zones de mémoire est-elle mise de côté pour empiler la mémoire? Je sais que ce n'est pas le heapspace bien sûr mais qu'en est-il de permgen ou non-heap (comme on l'appelle dans JConsole)Comment surveiller la mémoire pour les piles de threads Java

+1

Est-ce que la machine a échange assez? –

+0

$> swap -s total: 1609736k octets alloués + 760644k réservés = 2370380k utilisé, 57741028k disponible. J'ai mis la taille de pile à 3072m donc le jvm devrait être en mesure d'utiliser un autre 1024mb pour un espace sans tas en théorie (un peu moins dans la réalité je suppose) – Ola

Répondre

0

Vous pouvez également essayer JProfiler. Dans JProfiler, vous pouvez obtenir des conseils à partir des vues Thread et Thread dans les vues de profilage de la CPU. Voici screencast pour le même.

Vous pouvez également vérifier les points suivants pour corriger votre problème: (référencé à partir du lien) Il y a quelques choses à faire si vous rencontrez cette exception.

  • Utilisez la commande PID -p lsof (plates-formes Unix ) pour voir combien de fils sont actifs pour ce processus.
  • Déterminez si le nombre maximal de threads par processus est défini par le système d'exploitation pour . Si la limite est trop faible pour l'application, essayez en augmentant la limite de thread par processus.
  • examiner le code d'application pour déterminer s'il y a un code qui est créant des fils ou des connexions (par ex comme connexions LDAP) et non les détruire. Vous pouvez vider les threads Java pour voir si un nombre excessif a été créé.
  • Si vous constatez que trop de connexions sont ouvertes par l'application, faites pour vous assurer que tout thread créé par l'application est détruit. Une application d'entreprise (.ear) ou l'application Web (.war) s'exécute sous une JVM longue durée . Tout simplement parce que l'application est terminée ne signifie pas que le processus JVM se termine. Il est impératif qu'une application gratuite toutes les ressources qu'il alloue. Une autre solution serait pour l'application d'utiliser un pool de threads pour gérer les threads nécessaires.

Une partie de votre code peut créer beaucoup de threads.

Essayez d'utiliser ThreadPoolExecutor (pool de threads) dans votre code pour limiter les threads dans votre application, et réglez la taille de votre pool de threads en conséquence pour de meilleures performances.

0

je fait une recherche rapide sur Google et a constaté que this forum thread a des discussions sur le même sujet