cómo hacer que un jvm haga una recolección de basura externamente

Tengo una aplicación implementada en producción que a veces lanza OutOfMemory excepción debido a alguna pérdida de memoria. Se está ejecutando en una caja ubuntu sin cabeza en la que preferiría no conectar visualvm, jconsole, etc. de forma remota. ¿Hay alguna manera de hacer el jvm hacer gc (como en visualvm donde simplemente haces clic en un botón para hacerlo).

Me gustaria correr jmap -histo:live <pid> y este gc ordena alternativamente para averiguar qué objetos sobreviven a un gc. Qué números de objetos están creciendo, etc. En este momento puedo ver algunos recuentos de objetos inesperados, pero está sucediendo en varios de mis objetos de dominio, por lo que no estoy seguro de si se trata de un gc retrasado o una pérdida de memoria.

En resumen, estoy buscando el comando de Linux para ejecutarlo contra un jvm pid para hacer que haga gc. No system.gc.

preguntado el 12 de junio de 12 a las 17:06

Si te quedas sin memoria debido a una pérdida de memoria, ejecutar gc no te ayudará. Una fuga de memoria ocurre exactamente cuando gc no puede eliminar objetos "muertos", porque hay una referencia oculta a ellos. -

Sí, parece un duplicado. Gracias por el enlace. No lo vi aparecer cuando busqué/escribí la q. -

OOM significa que no tiene más memoria (o al menos no tiene suficiente espacio contiguo después de que GC lo haya hecho). Ya está ejecutado, hacer otro pase sin embargo iniciado no va a resolver nada. Podría detectar que la aplicación no se está ejecutando y comenzar de nuevo como una medida temporal, pero lo que debe hacer es ordenar el código.Algo(s) que debería(n) estar fuera del alcance no lo están.

2 Respuestas

El GC intentará limpiar agresivamente los objetos sin referencia a medida que se llena el montón. Entonces no es un "gc retrasado". Creo que está en el camino correcto, use jmap y obtenga un volcado de pila. Luego analícelo para ver qué objetos de aplicación sobreviven que no deberían. Es posible que deba obtener un par de volcados de pila y compararlos entre sí.

Respondido el 12 de junio de 12 a las 19:06

Es bastante difícil para obtener una fuga de memoria real en Java. Si recibe un error de falta de memoria, lo más probable es que se esté quedando sin memoria. Entonces, para solucionar esto, debe encontrar referencias a objetos no utilizados y limpiarlos manualmente. Porque de lo contrario, el recolector de basura no puede liberar la memoria desperdiciada.

Cuando la JVM no puede asignar más memoria, el recolector de elementos no utilizados debería ejecutarse automáticamente.

contestado el 23 de mayo de 17 a las 11:05

Ha pasado un tiempo desde que trabajé en Java, y esta pregunta es bastante antigua, pero esta información no es precisa. Al menos hasta Java 5, definitivamente era fácil obtener dependencias circulares entre sus objetos. Esto puede suceder cuando trabaja con grupos de objetos, estructuras de datos complejas o como interacciones entre marcos. Aprenda a utilizar las herramientas de inspección de JVM. Lo beneficiarán enormemente y definitivamente encontrará problemas de memoria JVM en producción. - Patrick Farrell

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.