La mayoría de las veces, en aplicaciones empresariales, el almacenamiento dinámico de Java es mayor que el tamaño ideal de 12 a 16 GB máximo. Me ha resultado difícil hacer que el generador de perfiles de NetBeans funcione directamente en estas grandes aplicaciones de Java.
Pero generalmente esto no es necesario. Puede usar la utilidad jmap que viene con jdk para tomar un volcado dinámico "en vivo", es decir, jmap va a volcar el montón después de ejecutar GC. Haga alguna operación en la aplicación, espere hasta que se complete la operación, luego tome otro volcado de pila "en vivo". Use herramientas como Eclipse MAT para cargar los heapdumps, ordene el histograma, vea qué objetos han aumentado o cuáles son los más altos. Esto daría una pista.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
Solo hay un problema con este enfoque; Los volcados en gran cantidad, incluso con la opción en vivo, pueden ser demasiado grandes para transferirse a la vuelta de desarrollo, y pueden necesitar una máquina con suficiente memoria/RAM para abrir.
Aquí es donde entra en juego el histograma de clase. Puede volcar un histograma de clase en vivo con la herramienta jmap. Esto dará solo el histograma de clase de uso de memoria. Básicamente no tendrá la información para encadenar la referencia. Por ejemplo, puede poner una matriz de caracteres en la parte superior. Y la clase String en algún lugar debajo. Tienes que dibujar la conexión tú mismo.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
En lugar de tomar dos vuelcos del montón, tome dos histogramas de clase, como se describe anteriormente; Luego compare los histogramas de clase y vea las clases que están aumentando. Vea si puede relacionar las clases de Java con sus clases de aplicaciones. Esto dará una buena pista. Aquí hay un script de pitones que puede ayudarlo a comparar dos volcados de histograma jmap. histogramparser.py
Finalmente, herramientas como JConolse y VisualVm son esenciales para ver el crecimiento de la memoria con el tiempo y ver si hay una pérdida de memoria. Finalmente, a veces su problema puede no ser una pérdida de memoria, sino un uso de memoria alto. Para esto, habilite el registro de GC, use un GC de compactación más avanzado y nuevo como G1GC; y se puede utilizar como herramientas de JDK jstat para ver el comportamiento GC vivo
jstat -gccause pid <optional time interval>
Otros referecences a Google para -jhat, jmap, GC completo, la asignación de Humongous, G1GC
Oracle tiene una página relevante aquí: https: //docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html#BABIIIAC – Laurel
Este es otro "voto" para JProfiler. Funciona bastante bien para el análisis de montón, tiene una interfaz de usuario decente y funciona bastante bien. Como dice McKenzieG1, $ 500 es más barato que la cantidad de tiempo que de lo contrario podrías quemar buscando la fuente de estas fugas. En cuanto al precio de las herramientas, no está mal. – joev