Sto lavorando su un server Java che gestisce un sacco di traffico molto denso. Il server accetta pacchetti dai client (spesso molti megabyte) e li inoltra ad altri client. Il server non memorizza mai esplicitamente alcuno dei pacchetti in entrata/in uscita. Tuttavia, il server viene continuamente eseguito nelle eccezioni OutOfMemoryException
.Forza l'eliminazione esplicita di un oggetto Java
Ho aggiunto System.gc()
nel componente che passa il messaggio del server, sperando che la memoria venga liberata. Inoltre, ho impostato la dimensione heap della JVM su un gigabyte. Sto ancora ricevendo altrettante eccezioni.
Quindi la mia domanda è questa: come posso essere sicuro che i messaggi dei megabyte non vengano accodati indefinitamente (nonostante non siano necessari)? C'è un modo per me di chiamare "cancella" su questi oggetti per garantire che non stiano usando il mio spazio dell'heap?
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
Per rispondere ad alcune delle risposte qui il mio codice non memorizza alcun riferimento. Il server è un proxy Socks che passa oggetti. Ho un ciclo while che legge un oggetto da un flusso in entrata e lo scrive su un flusso in uscita. Questo è tutto. Guardando ora gli profiler della memoria. –
leggi molto rapidamente il capitolo "Effective Java";) – Bozho
chiudi quei flussi? Fornisci del codice – Bozho