2013-01-23 4 views
6

Ho un server Jetty che utilizzo per le connessioni websocket per un'app su cui sto lavorando. L'unico problema è che Jetty sta consumando troppa memoria virtuale (! 2,5 GB di memoria virtuale) e circa 650RES.Informazioni sull'utilizzo della memoria per Jetty

Il mio problema è che, come accennato in precedenza, la maggior parte della memoria (circa 12 GB) non è la dimensione dell'heap, quindi analizzarla e capire cosa sta succedendo è più difficile.

Hai qualche consiglio su come capire da dove proviene il consumo di 12 gb e come individuare perdite di memoria o altri problemi con il server?

Ho voluto specificare ciò che intendo per memoria virtuale (perché la mia comprensione potrebbe essere sbagliata). La memoria virtuale è "VIRT" quando corro in cima. Ecco cosa ottengo:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND           
-------------------------------------------------------------           
9442 root 20 0 12.6g 603m 10m S 0 1.3 1:50.06 java 

Grazie!

+0

Quale versione di Jetty? –

+0

Joakim, sto usando 8.1.7.v20120910 – user220755

+0

controllo consumo memoria con long totalMemory = Runtime.getRuntime(). TotalMemory(); long freeMemory = Runtime.getRuntime(). FreeMemory(); return (totalMemory - freeMemory); – Hurda

risposta

1

La memoria virtuale ha quasi un costo in un ambiente a 64 bit, quindi non sono sicuro di quale sia il problema. La memoria residente è di 650 MB o solo l'1,3% di MEM. Non è chiaro che stia usando molta memoria.

La dimensione massima di heap predefinita è 1/4 della memoria principale per JVM a 64 bit. Se si dispone di 48 GB di memoria, è possibile che la dimensione heap predefinita sia 12 GB e con alcune librerie condivise, thread ecc. Ciò può comportare una dimensione di memoria virtuale di 12,5 GB. Questo non significa che hai una perdita di memoria, o che hai persino un problema, ma se preferisci puoi ridurre la dimensione massima dell'heap.

BTW: è possibile acquistare 32 GB per meno di $ 200. Se stai esaurendo la memoria, ne comprerei di più.

+2

Bene, non si tratta di acquistare più memoria, si tratta di consumare troppa memoria sui computer client. Non è troppo per Jetty consumare 12 GB di memoria quando la mia app è installata sul computer di qualcuno? :) – user220755

+1

per essere chiari, non è _jetty_ che occupa questa memoria, ma qualunque cosa accada essere distribuita nel molo, il molo stesso ha un ingombro ridotto –

+0

Si afferma che la memoria residente è 650 MB. Questa è la quantità totale effettiva di memoria che sta utilizzando, inclusa la memoria condivisa e i thread.Il 12 GB è la memoria heap massima che potrebbe utilizzare. –

4

Si prega di incollare le opzioni JVM che si utilizzano all'avvio. È possibile regolare la memoria massima utilizzata dalla JVM con l'opzione -Xmx come già accennato.

L'applicazione utilizza solo memoria riservata di 603 MB. Quindi non sembra che dovrebbe interessarti. Puoi ottenere informazioni dettagliate sull'uso della memoria usando "jmap", abilita jmx e connettiti tramite jconsole o usa un profiler. Se vuoi rimanere in * nix land puoi anche provare "gratis" se il tuo sistema operativo lo supporta.

Nel tuo caso il Jetty NON sta occupando 12,5 gig di memoria. Occupa 603 MB. Ad esempio Google per "memoria virtuale linux" e dovresti ottenere molte informazioni sulla differenza tra memoria virtuale e riservata.