Resolución de pérdida de memoria del recolector de basura [cerrado]

Un sistema de back-end de Java se enfrenta a una carga tan grande que el recolector de basura no puede manejar y hay pérdidas de memoria. ¿Como puede ésto ser resuelto?

preguntado el 09 de enero de 11 a las 03:01

No es así como funciona Java GC ... -

Cómo encontrar una fuga de memoria de Java: stackoverflow.com/questions/40119/… -

¿Está utilizando finalizadores? El GC puede comportarse de manera extraña (y a menudo de manera no óptima) cuando los finalizadores están en la mezcla. -

Es fácil demostrarse a sí mismo que el GC no tiene fugas bajo carga. Te sugiero que lo hagas como ejercicio y podrás pasar a encontrar el problema real. -

De acuerdo con Peter, haga un volcado de pila y analice con JHAT ... -

4 Respuestas

Lo dudo mucho. Las fugas de memoria, a menos que sean por código nativo, es realmente un caso de sobrecarga de memoria. La hinchazón de la memoria son solo objetos que tienen fuertes referencias que nunca se anulan.

Respondido el 09 de enero de 11 a las 06:01

En Java, la única forma en que puede terminar con una pérdida de memoria es retener una referencia que ya no necesita. Dado que su aplicación aún tiene acceso a la referencia, el recolector de basura no podrá limpiarla y, desde la perspectiva del recolector de basura, no hay forma de saber que se trata de una fuga.

Lo único que se puede hacer al respecto es arreglar las fugas. En cuanto a cómo encontrarlos y detectarlos ... lamentablemente no tengo muchas sugerencias. ¿Quizás podría agregar código a sus pruebas unitarias para verificar que las funciones liberen memoria que ya no necesitan? ¿O podría ejecutar sus pruebas unitarias con la memoria VM muy reducida para determinar qué unidades son responsables de la mayoría de las asignaciones? Hay algunos patrones que comúnmente pueden resultar en una fuga. Por ejemplo, mantener una subcadena de una cadena más grande (por ejemplo, si lee un archivo en una cadena), ya que la subcadena principal es una referencia a la cadena de la que proviene. Supongo que se podría escribir un programa para detectar este y otros patrones comunes que conducen a fugas. Sin embargo, no conozco ningún programa disponible actualmente que realice este tipo de detección de fugas probables.

Respondido el 09 de enero de 11 a las 06:01

A menos que esté utilizando una implementación de JVM inusual, las "fugas" de memoria solo ocurren realmente cuando se aferran a los objetos mucho más tiempo del necesario. Si Java detecta que todavía se puede acceder a un objeto, nunca lo recopilará, ya que podría afectar la semántica del programa.

Si está interesado en reducir el uso de la memoria, intente romper las referencias a objetos que ya no necesita, o utilice WeakReferences o WeakHashMaps tener objetos almacenados de manera que puedan ser recuperados automáticamente.

Si desea intentar rastrear qué está exactamente en la memoria desperdiciando espacio, es posible que desee consultar este documento sobre la detección de posibles fugas de memoria al observar los accesos a objetos. Esta herramienta aparentemente funciona bastante bien, aunque no estoy tan familiarizado con ella.

¡Espero que esto ayude!

Respondido el 09 de enero de 11 a las 07:01

por lo que la herramienta a la que hace referencia el documento, SWAT, suena interesante, pero buscar en Google no revela una implementación real para descargar. ¿O me estoy perdiendo algo? - semillas de naranja

Hmmm ... en realidad no sé dónde conseguir una copia. :-( Te avisaré si encuentro algo. - templatetypedef

jmap es tu amigo. Existen algo Fugas en la JVM actual (sol / oráculo), pero dudo mucho que el OP esté hablando. Los finalizadores son similares a las referencias fantasmas (implícito por java.lang.ref.FinalReference; no ensucian el GC por sí solo, hacer que un objeto esté disponible mediante el método finalize es algo diferente)

Respondido el 09 de enero de 11 a las 18:01

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