Consumo di memoria JVM


9

Sto cercando di eseguire Tomcat su un sistema a memoria insufficiente (150-256 Mb). Anche se avvio JVM con -Xmx64m (che dovrebbe comunque essere l'impostazione predefinita), il processo richiede immediatamente 200 Mb +.

Mi chiedo perché la JVM abbia bisogno di così tanta memoria stessa, o se c'è un modo di sintonizzarla? Altre JVM sono migliori di quella solare per un basso consumo di memoria e funzionano con Tomcat?

Risposte:


5

Oltre all'heap (specificato da -Xmse -Xmx) è necessario includere le aree non heap. Questi includono

  • Perm Gen, che è 64 MB su sistemi a 32 bit e inizialmente 96 MB su sistemi a 64 bit
  • La cache del codice, che è tra 20 e 40mb a seconda della JVM
  • L'area del buffer NIO (da cui DirectByteBuffervengono estratti gli s), inizialmente è 64mb

C'è anche lo spazio di lavoro della JVM stessa che sarà qualche decina di MB.

È inoltre necessario essere consapevoli del dimensionamento automatico di Sun JVM quando si utilizza un computer di classe server . Nel tempo la definizione di classe server (memoria da 2 GB, più di un core) ha subito un deprezzamento e ora la maggior parte delle macchine è in grado di innescare le -serverottimizzazioni. Il mio consiglio è sempre quello di indicare le -Xmse le -Xmximpostazioni e passare -servera meno che non si può pensare a una buona ragione per non troppo.


Fai attenzione anche alla memoria virtuale che JVM riserva e non utilizza ancora.
Steve Schnepp,

È vero, la maggior parte di questi segmenti, come PermGen e Code Cache, sono allocati all'avvio, ma la maggior parte dei kernel eviterà di allocare pagine a tali segmenti fino a quando necessario.
Dave Cheney,

1
Grazie per le informazioni - penso che questo spieghi dove sta andando la memoria. C'è un modo per cambiare questi valori? Ancora meglio sarebbe un modo per vedere quanta parte di ogni sezione era in uso - non so se qualcuno degli strumenti di debug / monitoraggio di Java te lo permetta?
Draemon,

1
È possibile utilizzare pmap o jmap per farsi un'idea dei vari segmenti in uso. La maggior parte delle opzioni comuni (e le loro impostazioni predefinite) sono elencate qui, java.sun.com/javase/technologies/hotspot/vmoptions.jsp . Cambiano spesso e sono soggetti a differenze nel sistema operativo (dimensioni dello stack di solito) e nell'arco (il sistema operativo a 64 bit implica generalmente aree JVM più grandi)
Dave Cheney,

3

Con l'opzione -Xmx puoi limitare la dimensione dell'heap che JVM riserva ... Ci sono risorse aggiuntive di cui JVM ha bisogno ...

"Grazie per la memoria" * è un buon articolo che spiega come una JVM utilizza la memoria ...

A parte questo, potresti provare la JVM di IBM che dovrebbe funzionare con Tomcat, non so se alcune delle implementazioni JVM gratuite funzionano.

Tuttavia, non penso che una macchina con memoria così bassa ti farà del bene. Java ha solo bisogno di memoria.

* Dato che i nuovi utenti non possono inviare collegamenti ipertestuali, devi cercare tu stesso l'articolo ... è il primo successo su Google per "grazie per la memoria ibm".


3
ibm.com/developerworks/java/library/j-nativememory-linux - Link all'articolo "Grazie per la memoria"
StackKrish,


0

Una tecnica utile che ho trovato è quella di utilizzare il monitoraggio JMX per vedere esattamente quanta memoria viene utilizzata dallo spazio heap vs permgen.

Configurare JMX in Tomcat come descritto qui http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Quindi utilizzare JConsole (fornito con JDK 5 o JDK 6): il tag di memoria monitorerà il consumo di memoria nel tempo.

Inoltre, fai attenzione ai riavvii soft delle webapp. Se ricarichi una webapp, lo spazio permgen non verrà raccolto e sarà accumulato nel tempo. È necessario eseguire un arresto / avvio completo di Tomcat per recuperare lo spazio Permgen.


VisualVM può anche essere usato al posto di JConsole e fornisce ulteriori dettagli quando si cercano problemi di memoria all'interno di JVM. Ho dovuto usare questo in più di un'occasione per trovare problemi.
Jeremy Bouse,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.