Si, en efecto, se crea una aplicación que cruje los datos mientras que sufren de memoria-fugas, puedo notar que la memoria según lo informado por, digamos:La detección de la memoria de fugas mediante programación
Runtime.getRuntime().freeMemory()
comienza a oscilar entre 1 y 2 MB de memoria libre.
La aplicación luego ingresa en un bucle que dice así: GC, procesando algunos datos, GC, etc. pero debido a que el GC ocurre con tanta frecuencia, la aplicación básicamente ya no hace mucho más. Incluso la GUI tarda años en responder (y, no, no estoy hablando de los problemas de EDT aquí, en realidad es la máquina virtual básicamente atrapada en un modo interminable de GC).
Y me preguntaba: ¿hay alguna forma de detectar mediante programación que la JVM ya no tiene suficiente memoria?
Tenga en cuenta que no estoy hablando de errores de memoria insuficiente ni de detectar la pérdida de memoria en sí.
Estoy hablando de detectar que una aplicación tiene tan poca memoria que básicamente está llamando al GC todo el tiempo, dejando casi ningún momento para hacer otra cosa (en mi ejemplo hipotético: datos crujientes).
¿Funcionaría, por ejemplo, leer repetidamente la cantidad de memoria disponible durante, digamos, un minuto, y ver si el número ha estado "oscilando" entre diferentes valores, digamos 4 MB, y concluye que ¿Ha habido alguna fuga y la aplicación se ha vuelto inutilizable?
creo una mejor idea sería fijar tu codigo. –
@San Jacinto: la falta de visión de su comentario es atractiva y no contribuye en nada a SO. Es probable que desee volver a leer la pregunta y la respuesta en caso de que tenga algo valioso para proporcionar en SO. – SyntaxT3rr0r
Solo cuando es tu código el que está actuando. No todo el software de terceros se crea igual, no por una posibilidad remota. Pensé que había un gancho de GC en el que podrías conectar ... déjame ver ... –