Pregunta

Tengo un servidor de línea de comandos basado en Java que se ejecuta que aloja los HighScores para un juego que hice en mi sitio web. Funciona de manera eficiente y rápida. ¡Sin embargo, se ocupa de unos 200 MB de RAM! He intentado todo, desde anular manualmente todo hasta el sistema de llamadas.gc ()

Estoy empezando a sospechar que esto podría tener algo que ver con la secuencia de entrada y los objetos de transmisión de salida que uso desde la conexión Socket. He notado que cuando ejecuto el programa por primera vez, ocupa una cantidad normal de RAM. Luego, una vez que obtiene una conexión, salta a 100 MB y sigue aumentando para cada conexión.

EDITAR: En una de mis clases, tengo todos los nombres, puntajes y marca de tiempo en 3 listas de matrices diferentes. Sin embargo, un examen exhaustivo usando JHAT y JMAP mostró que combinados solo usan aproximadamente 5 MB de RAM.

Si esto es demasiado vago para que alguien responda, pregunte y con mucho gusto le daré el código fuente.

¿Fue útil?

Solución

Es posible que tenga una fuga causada por retener referencias a objetos más allá de su vida útil.

Le sugiero que obtenga un perfilador y lo use para investigar. Un inicio de lugar bueno y gratuito es el programa VisualVM que se distribuye con Java 6.

Un Profiler es un programa separado que se adjunta al JVM o aloja un JVM para su programa y monitorea la ejecución de su programa. Puede rastrear las asignaciones de objetos y la ejecución del código, ya sea estadísticamente o "instrumentando" el código de ejecución. Le mostrará si los objetos están siendo asignados y no lanzados, y puede mostrar qué objetos son y dónde se asignaron (entre muchas otras cosas útiles).

Utilizo JProfiler, que es comercial (pero vale la pena para un profesional). La última vez que busqué en varios perfiladores de buena calidad disponibles de forma gratuita (al menos para uso personal). VisualVM tiene capacidades básicas, pero útiles, de perfil, y comenzaría allí (en Windows puede encontrarlo en el directorio JDK bin; supongo que lo mismo es cierto para Linux y Mac).

Otros consejos

Intente usar algo como JMAP seguido de Jhat para ver cómo se está utilizando su memoria.

JVM de Sun (Oracle) nunca libera memoria al sistema operativo, por lo que no es sorprendente que veas un aumento monotónico en el uso de la memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top