Faire un “vidage de la mémoire” de l'application java?
J'ai de l'application Java, qui, malheureusement, commence à consommer de très grandes quantités de mémoire après un certain temps. Pour compliquer les choses, ce n'est pas seulement de l'application Java, il est également JavaFX 2 de la demande.
Je soupçonne qu'il ya une fuite de mémoire, peut-être même sous-jacent, JavaFX appels et natif libs.
La solution idéale serait de faire un dump de tous les objets java à un certain moment (avec leur utilisation de la mémoire), puis d'analyser l'image. Est-il un moyen pour y parvenir?
Quelle plate-forme travaillez-vous? Linux, Win, Mac?
Linux (Ubuntu 10.10).
Linux (Ubuntu 10.10).
OriginalL'auteur Rogach | 2012-08-18
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup de façons d'obtenir un tas de vidage, en commençant avec des outils simples comme les plus chics des trucs comme JVisualVM ou même commerciaux, des outils comme JProfiler. Une interprétation correcte de ces dumps peut être difficile, cependant, de sorte que vous pouvez poster exactement ce que vous cherchez. Allez à la chasse pour une fuite de mémoire, ou êtes-vous intéressé à obtenir une idée générale de votre application?
Il sera plutôt difficile de trouver une fuite s'il est en effet causé par la JavaFX classes (même si je ne suis pas au courant de tous les problèmes). Si vous y avez accès, je recommande d'obtenir JProfiler pour cela, mais je suis sûr que d'autres applications (que j'ai peut-être pas au courant de l') peut faire le travail aussi bien. L'approche de base est de faire un dump du tas, l'examen de poisson à la recherche de l'objet populations et à l'aide de l'outil pour tracer les instances de retour à leur GC racines (quelque chose que vous ne voulez pas le faire à la main). Cette fonctionnalité sera essentiellement dire pourquoi une instance n'a pas été nettoyée.
Je suis à l'aide de jvisalvm maintenant, et à en juger par le fait que ma demande a croissance lente de la taille du segment, ce n'est pas le résultat de natif de fuites, mais les fuites d'objets java. Donc j'ai l'espoir qu'il serait facile à résoudre. Merci pour votre aide!
Gardez à l'esprit que l'augmentation constante du tas ne prouve pas une fuite de mémoire jusqu'à ce que vous obtenez en fait la OOMException. En fonction de votre garbage collector c'est peut-être juste ordures non ramassées qui est à gauche jusqu'à ce qu'une collection complète est nécessaire.
Malheureusement, j'ai vérifié (en forçant GC de jvisualvm) et il ne semble pas que les poubelles non ramassées. Le véritable problème est que la mémoire continue à s'accumuler même si l'application se trouve absolument rien.
OriginalL'auteur sarcan
Utilisation
jmap -heap:format=b <process-id>
pour créer un fichier binaire de vidage de la masse, qui peut ensuite être chargé dans plusieurs outils - ma préférée étant "l'Éclipse de la Mémoire de l'Analyseur"OriginalL'auteur pjklauser
Vous pouvez utiliser jvisualvm. Il a un plugin pour voir le live de la mémoire et de faire un dump.
OriginalL'auteur Edwin Dalorzo
Je viens de re-découvert cet article lors de la recherche de façons de saisir "JVM état du droit en ce moment" - après un tas j'ai tiré avec
jmap
était d'environ la moitié de la taille de ce que les MBeans signalés. Je vais l'ajouter pour être complet:Nécessite gdb installé (pour
gcore
) et une installation de JDK (jmap). Notez également que vous auriez peut-être besoin d'ajuster/usr/bin/java
le chemin de la JVM utilisée pour le processus.OriginalL'auteur mabi