Domanda

Ho un server di riga di comando basato su Java che ospita HighScores per un gioco che ho realizzato sul mio sito Web. Funziona in modo efficiente e veloce. Tuttavia, impiega circa 200 MB di RAM! Ho provato di tutto dal annullare manualmente tutto a Calling System.gc ()

Sto iniziando a sospettare che questo potrebbe avere qualcosa a che fare con gli oggetti del flusso di input e del flusso di output che utilizzo dalla connessione socket. Ho notato che quando eseguo per la prima volta il programma, occupa una normale quantità di RAM. Quindi, una volta che ottiene una connessione, salta a 100 MB e continua a salire per ogni connessione.

EDIT: In una delle mie classi, tengo tutti i nomi, i punteggi e il timestamp in 3 diverse liste di array. Tuttavia, un esame approfondito che utilizza JHAT e JMAP ha mostrato che combinati usano solo circa 5 MB di RAM.

Se questo è troppo vago affinché chiunque possa rispondere, chiedi e darò volentieri il codice sorgente.

È stato utile?

Soluzione

Potresti avere una perdita causata dal consumo di riferimenti agli oggetti oltre la loro vita utile.

Ti suggerisco di ottenere un profiler e di usarlo per indagare. Un buon punto di partenza e un buon punto è il programma VisualVM che distribuisce con Java 6.

Un profiler è un programma separato che si collega a JVM o ospita un JVM per il tuo programma e monitora l'esecuzione del programma. Può tracciare gli allocazioni degli oggetti e l'esecuzione del codice, statisticamente o "strumentando" il codice di esecuzione. Ti mostrerà se gli oggetti vengono assegnati e non rilasciati e può mostrare quali sono gli oggetti e dove sono stati assegnati (tra molte altre cose utili).

Uso JProfiler, che è commerciale (ma ne vale la pena per un professionista). L'ultima volta che ho cercato c'erano diversi profili di buona qualità disponibili gratuitamente (almeno per uso personale). VisualVM ha funzionalità di profilazione di base, ma utili, e inizierei (su Windows puoi trovarlo nella directory JDK Bin; presumo che lo stesso sia vero per Linux e Mac).

Altri suggerimenti

Prova a usare qualcosa come JMAP seguito da Jhat per vedere come viene effettivamente utilizzata la tua memoria.

Il JVM di Sun (Oracle) non rilascia mai la memoria sul sistema operativo, quindi non sorprende che tu veda un aumento monotonico dell'uso della memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top