La plupart du temps, dans les applications d'entreprise, le tas Java donné est plus grand que la taille idéale de 12 à 16 Go maximum. J'ai eu du mal à faire fonctionner le profileur NetBeans directement sur ces grandes applications java.
Mais ce n'est généralement pas nécessaire. Vous pouvez utiliser l'utilitaire jmap fourni avec le jdk pour effectuer un vidage de tas "en direct", c'est-à-dire que jmap videra le tas après avoir exécuté GC. Effectuez une opération sur l'application, attendez que l'opération soit terminée, puis effectuez un autre vidage de tas "en direct". Utilisez des outils comme Eclipse MAT pour charger les tas de tas, trier sur l'histogramme, voir quels objets ont augmenté, ou lesquels sont les plus élevés, cela donnerait un indice.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
Il n'y a qu'un seul problème avec cette approche; D'énormes vidages de tas, même avec l'option live, peuvent être trop volumineux pour être transférés vers le tour de développement, et peuvent nécessiter une machine avec suffisamment de mémoire / RAM pour s'ouvrir.
C'est là que l'histogramme de classe entre en scène. Vous pouvez vider un histogramme de classe en direct avec l'outil jmap. Cela ne donnera que l'histogramme de classe de l'utilisation de la mémoire. Fondamentalement, il n'aura pas les informations pour enchaîner la référence. Par exemple, il peut mettre un tableau de caractères en haut. Et la classe String quelque part en dessous. Vous devez établir le lien vous-même.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
Au lieu de prendre deux vidages de tas, prenez deux histogrammes de classe, comme décrit ci-dessus; Ensuite, comparez les histogrammes de classe et voyez les classes qui augmentent. Voyez si vous pouvez associer les classes Java à vos classes d'application. Cela donnera un assez bon indice. Voici un script pythons qui peut vous aider à comparer deux vidages d'histogramme jmap. histogramparser.py
Enfin, des outils comme JConolse et VisualVm sont essentiels pour voir la croissance de la mémoire au fil du temps, et voir s'il y a une fuite de mémoire. Enfin, parfois, votre problème peut ne pas être une fuite de mémoire, mais une utilisation élevée de la mémoire. Pour cela, activez la journalisation GC, utilisez un GC de compactage plus avancé et nouveau comme G1GC; et vous pouvez utiliser des outils jdk comme jstat pour voir le comportement du GC en direct
jstat -gccause pid <optional time interval>
Autres références à google pour -jhat, jmap, Full GC, Humongous allocation, G1GC