Comment détecter la cause de OutofMemoryError?
J'ai une plainte qu'un serveur d'application de la mine est de s'écraser sur le haut de la charge.
C'est une application web s'exécutant dans Tomcat 5
.
Je vois le fil décharges et je vois qu'il existe un dépassement de mémoire erreur
1TISIGINFO Dump de l'Événement "systhrow" (00040000) Détail
"java/lang/OutOfMemoryError" "n'a pas à créer de thread: retVal -1073741830, errno 12" >reçu 1TIDATETIME Date: 2012/07/17 à 20:03:17 1TIFILENAME >Javacore filename:C:\ServerApplication\Tomcat5\bin\javacore.34545719.4646464.4172.0003.txt
Le tas d'informations est le suivant:
Maximum Java heap size : 1500m
Initial Java heap size : 256m
C'est la configuration initiale et Max de la taille du segment (32 bits de java)
Je vois aussi qu'il est disponible gratuitement à l'espace de tas
1STHEAPFREE Bytes of Heap Space Free: 2D19F3C0
1STHEAPALLOC Bytes of Heap Space Allocated: 5DC00000
C'est autour de 750 MO d'espace libre, non?
Et de la méthode de fil de l'analyse, je vois que le nombre de Threads est 695
de qui 49%
est java/lang/Object.wait(Native Method)
et 39%
est dans sun/misc/Unsafe.park(Native Method)
Aussi je vois ce NO JAVA STACK 1%
pas sûr de ce que cela signifie.
Aussi 0 girons impasse et 2%
est Praticable.
Je ne suis pas sûr de savoir comment interpréter cette information ou comment aller à partir d'ici, pour détecter la cause sous-jacente.
Toute aide à ce sujet?
vous réfère à la
retVal
ou errno
que vous recommander je devrais regarder? Où dois-je chercher?Les deux, mais errno serait sans doute plus instructif(retval probablement juste indique un échec, peut-être ce type de panne, pas sûr, je n'ai aucune expérience avec Windows)
Bien que n'étant pas nécessairement la réponse à votre question, avez-vous essayé d'utiliser le NIO ou AVR connecteurs dans Tomcat à la place de celui par défaut? De cette façon, vous ne serez pas en lançant un nouveau thread par connexion.
OriginalL'auteur Jim | 2012-07-27
Vous devez vous connecter pour publier un commentaire.
Selon ce post:
Donc cette erreur peut très bien n'avoir aucun rapport avec la mémoire, c'est juste que trop de threads sont créés...
EDIT:
Que vous avez 695 threads, vous devez 695 fois la taille de la pile de la mémoire. Considérant ce post sur le thread des limites, je pense que vous essayez de créer un trop grand nombre de threads pour la mise à disposition d'espace de mémoire virtuelle.
OriginalL'auteur beny23
Vous devriez commencer à la JVM avec le
-XX:+HeapDumpOnOutOfMemoryError
drapeau. Ceci va produire un heap dump lorsque leOutOfMemoryError
est généré.Puis, comme @Steve a dit, vous pouvez utiliser un outil comme les MAT pour analyser le fichier de vidage et de voir les objets qui sont alloués, et qui est de garder des références. Ce sera généralement vous donner une idée sur les raisons de votre JVM est épuisant sa mémoire.
OriginalL'auteur Flavio
Je sais ce que tu veux dire, il peut être difficile de trouver un endroit pour commencer.
Ont un coup d'oeil à Eclipse De La Mémoire De L'Analyseur (MAT). Il utilisera JHat faire un dump d'un instantané de la mémoire de votre programme dans un fichier, que vous pouvez ré-ouvrir et analyser.
Le navigateur pour que ce fichier décrit tous les objets créés par le programme très soigneusement, et vous pouvez regarder dans les différents niveaux pour trouver si quelque chose est suspect.
Ajoutant mes commentaires pour la réponse...
Droit lors de votre
executablewebapp se bloque, vidage à TAPIS. TAPIS de va vous dire ce que l'objet est créé un tas de fois. Si c'est un objet personnalisé, et c'est souvent le cas, il est facile à trouver. Si non, vous pouvez voir son parent, amputer, et dribble vers le bas à partir de là (désolé pour l'exemple graphique, je ne suis pas entièrement axé sur DONC pour le moment :).Oh, et j'ai oublié de mentionner, vous pouvez exécuter le programme plusieurs fois sous plusieurs conditions, et de faire un dump chaque fois. Ensuite, vous pouvez analyser chaque vidage de la tendance.
Désolé, manqué ce trop. Si je ne me trompe pas, le TAPIS de décharges de la JVM processus, donc tant que la machine virtuelle est en cours d'exécution sur votre boîte, vous pouvez vider de ses processus et de voir ce qu'il se passe.
Un autre commentaire muté en solution partielle...
C'est de plus en plus difficile qu'elle ne l'est en réalité. Sérieusement, c'est assez facile, après l'exécution de TAPIS une fois ou deux fois pour obtenir le coup de choses. Exécutez votre application jusqu'à ce que la chose se bloque. Le Dump. Changer quelque chose. Exécuter, crash dump. Répétez. Ensuite, ouvrez les décharges dans le TAPIS, et de comparer ce qui vous semble suspect.
La partie la plus délicate quand j'apprenais cela était de trouver l' ID de processus de vidage - qui n'est pas encore trop abrutissante.
Je vois que jmap s'attend à un exécutable à la carte les segments de mémoire.Mais dans mon cas, que dois-je utiliser?J'ai une application web s'exécutant dans Tomcat.
Fait quelques commentaires, mais ils sont mieux annexé à la réponse.
Le problème est que je ne peux pas reproduire ici.Vous dites que je dois reproduire ce et puis connectez-vous à la procédure pour collecter les dumps?
Édité à nouveau 🙂
OriginalL'auteur Ben
Un message similaire sur IBM WebSphere montre cette ligne
comme le signe d'une natif OOM qui signifie fil (de la procédure) tente de demander à une grande partie de la mémoire sur le tas.
IBM lien ci-dessus propose une série de mesures dont certaines sont IBM spécifiques. Un coup d'oeil.
À partir d'un natif de l'utilisation de la mémoire de la perspective:
Une autre chose que vous pourriez regarder est la PermGenSpace - grand comment est-il?
Ce lien http://www.codingthearchitecture.com/2008/01/14/jvm_lies_the_outofmemory_myth.html suggère
Aussi avez-vous configuré une valeur dans server.xml pour maxThreads ? La valeur par défaut est de 200 mais votre application semble avoir 695 ?
500
threads server.xml. Ce nombre est trop grand?vous pouvez essayer de réduire - si vous le permettez 500 threads de demande entrant dans le système, chacun aura besoin de son propre gestionnaire de fichier, etc, qui prend de la mémoire. ayant dit que non. de threads de demande est différente de la 695 threads de l'application dans le processus beny23 la réponse est mieux
OriginalL'auteur JoseK
Fixer
Suivi IBM technote java.lang.OutOfMemoryError lors de la création de nouveaux threads, spécifiquement 'espace' de la commande pour augmenter la valeur par défaut de 1024.
Symptôme
Environnement
CentOS 6.6 64 bits
IBM a ÉTÉ 8.5.0.2 64 bits
Références
OriginalL'auteur mon