Estoy trabajando en un servidor Java que maneja mucho tráfico muy denso. El servidor acepta paquetes de clientes (a menudo muchos megabytes) y los envía a otros clientes. El servidor nunca almacena explícitamente ninguno de los paquetes entrantes/salientes. Sin embargo, el servidor se ejecuta continuamente en OutOfMemoryException
excepciones.Forzar la eliminación explícita de un objeto Java
Agregué System.gc()
en el componente de paso de mensajes del servidor, con la esperanza de que se liberara la memoria. Además, establezco el tamaño de almacenamiento dinámico de la JVM en un gigabyte. Todavía recibo tantas excepciones.
Así que mi pregunta es esta: ¿cómo puedo asegurarme de que los mensajes megabyte no se pongan en cola indefinidamente (a pesar de no ser necesarios)? ¿Hay alguna forma de que llame a "eliminar" en estos objetos para garantizar que no están utilizando mi espacio de almacenamiento dinámico?
try
{
while (true)
{
int r = generator.nextInt(100);//generate a random number between 0 and 100
Object o =readFromServer.readObject();
sum++;
// if the random number is larger than the drop rate, send the object to client, else
//it will be dropped
if (r > dropRate)
{
writeToClient.writeObject(o);
writeToClient.flush();
numOfSend++;
System.out.printf("No. %d send\n",sum);
}//if
}//while
}//try
Para responder algunas de las respuestas aquí, mi código no almacena ninguna referencia. El servidor es un proxy Socks que pasa objetos. Tengo un ciclo while que lee un objeto de un flujo entrante y lo escribe en un flujo saliente. Eso es. Examinando los perfiladores de memoria ahora. –
leyó el capítulo de "Java efectivo" muy rápidamente;) – Bozho
¿cierra esas corrientes? Dé un código – Bozho