memoria maquina aumentar java servlets jvm memory-profiling

maquina - aumentar memoria java



Cómo perfil de memoria JVM en el código? (5)

Por lo tanto, creo que necesito escribir declaraciones de depuración que puedan decirme el uso actual de la memoria.

Lo más probable es que no lo ayude mucho, ya que el recolector de basura hace que sea difícil encontrar pérdidas de memoria solo mirando los conteos (realmente no se sabe cuándo se ejecuta el gc y qué es lo que realmente se recolecta, a veces no se recolecta todo lo que es coleccionable). Por lo tanto, es posible que necesite hacer algunas instantáneas de memoria y analizarlas, es decir, ver qué objetos (o qué tipos de objetos) no se recopilan y, por lo tanto, se crean cada vez más instancias.

Para esto, eche un vistazo a las herramientas sugeridas (JVisualVM, JConsole).

Si aún desea obtener información de uso de memoria desde su programa, pruebe las clases en el paquete java.lang.management ;

Estoy escribiendo un servlet que no puedo probar en Eclipse, necesito ejecutarlo en el servidor. Quiero hacer perfiles de memoria e identificar cualquier fuga. Por lo tanto, creo que necesito escribir declaraciones de depuración que puedan decirme el uso actual de la memoria. ¿Puede alguien señalarme buenas referencias sobre cómo hacer esto y / o qué clases en el JDK hacen esto?

Tenga en cuenta que no puedo usar el "Eclipse MAT".


¿No puedes usar la herramienta incorporada en jdk jvisualvm ?


Perfilar la memoria de la aplicación y buscar fugas sería una tarea difícil, por no mencionar que es engañosa con declaraciones simples de depuración. Si no puede utilizar una herramienta que se conecta de forma remota a su proceso, usar hprof sería una buena opción para IMO. Además, eche un vistazo a la documentación de solución de problemas aquí .

Pero todavía creo que sería mejor si intentara hacer lo mismo a nivel local (es decir, arreglando fugas) si es posible.



Por lo tanto, creo que necesito escribir declaraciones de depuración que puedan decirme el uso actual de la memoria.

Creo que eres como yo, que prefiere crear un perfil en código en lugar de utilizar una herramienta de creación de perfiles externos como JVisualVM o JConsole.

Puede utilizar una herramienta llamada MemorySampler (escrita por mí) de CoralBits que le dirá exactamente en qué línea de su memoria de códigos se está asignando . Debajo de un ejemplo:

ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>(); MemorySampler.start(); for(int i = 0; i < strings.length; i++) queue.offer(strings[i]); for(int i = 0; i < strings.length; i++) queue.poll(); MemorySampler.end(); if (MemorySampler.wasMemoryAllocated()) MemorySampler.printSituation();

Te da el siguiente resultado:

Memory allocated on last pass: 24576 Memory allocated total: 24576 Stack Trace: java.util.concurrent.ConcurrentLinkedQueue.offer(ConcurrentLinkedQueue.java:327) TestGC.main(TestGC2.java:25)

Ahora, si va a la línea 327 del código fuente ConcurrentLinkedQueue , verá que allí asigna una instancia de Node .

Descargo de responsabilidad: soy uno de los desarrolladores de CoralBits.