Tomcat Consumo di memory eccessivo

Ho un nuovo server che esegue Ubuntu 11.04 (Natty) (64 bit). Ho iniziato installando openjdk e tomcat6 . Quando il server Tomcat si avvia, utilizza immediatamente 480+ MB di memory. Questo sembra fuori strada e mi chiedo se qualcuno abbia una soluzione per far sì che Tomcat utilizzi memory da 200-300 MB (o less).

Ho usato il memtop per vedere questo: (Nota: ho rimosso tutte le voci grandi. La voce di 499MB è Tomcat)

  user@xyz:~# python memtop-0.9.py PID | private/writ. mem |command | current | previous |(truncated) 19776 | 499.3 MB | +++++ |/usr/lib/jvm/java-6-openjdk/bin/java-Djava.util.logging.config.file=/var/lib/tomcat6/conf/logging.properties-Djava.awt.headless=true-Xm 18082 | 148.6 MB | +++++ |/usr/sbin/mysqld 1385 | 3.6 MB | ++ |pythonmemtop-0.9.py RAM usage: ============================================== 69.3 % 

Inoltre, puoi vedere quali sono i pacchetti JDK e Tomcat installati:

 user@xyz:~# dpkg --get-selections | grep jdk default-jdk install openjdk-6-jdk install openjdk-6-jre install openjdk-6-jre-headless install openjdk-6-jre-lib install user@xyz:~# dpkg --get-selections | grep tomcat libtomcat6-java install tomcat6 install tomcat6-admin install tomcat6-common install tomcat6-user install 

Lo script di avvio per Tomcat imposta Xmx a 128M :

 JAVA_OPTS="-Djava.awt.headless=true -Xmx128M" 

Qualcuno ha delle idee su cosa posso fare per battere il consumo di memory fino a qualcosa di più ragionevole? Non capisco perché i JVM e Tomcat avrebbero bisogno di consumare tanta memory.

EDITS

Per questo, ho scaricato Tomcat 6 direttamente e ho eseguito lo script di avvio. Tieni presente che nessun valore Xmx è stato impostato questa volta. Quando si esegue questa operazione, il memtop mostra che Tomcat utilizza memory di 737 MB !

Questo mi port a credere che ci sia un problema con openjdk che utilizza una grave quantità di memory per il JVM.


Ho provato la stessa cosa con un nuovo download zip di Tomcat 7 – stesso problema. Usava 740 MB di memory.


Ho installato il Sun JRE / JDK. Il consumo di memory è sceso a circa 400 MB (da quasi 500 MB). Questo è ancora più utilizzo di memory di quello che preferirei!

(sun-java6-bin, sun-java6-jdk, sun-java6-jre)


Quando corrono al top , ottengo questo:

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13749 tomcat6 20 0 481m 68m 9892 S 0 7.4 0:02.85 java 

Mi rendo conto e spero che una macchina a 64 bit / JVM utilizzerà più memory, ma non mi aspettavo che fosse questo alto. Sto eseguendo su un VM che mi garantisce solo 512 MB.

  • L'appartenenza al gruppo perso in modo errato dopo i registri utente in Ubuntu, winbind, AD
  • Qual è il modo più veloce per installare Python 2.6 su un server Ubuntu 8.04?
  • Ha commentato la linea AuthorizedKeysFile ma sembra ancora funzionare
  • Molti processi Postgresql. come gestirli?
  • server VPN strongSwan + xl2tpd: come configurare più file di configuration?
  • apt-get comandi che fanno pausa a 'Attesa per le intestazioni'
  • Rilasciare un'image dd in più file
  • Autenticazione PAM / LDAP con Ubuntu 10.04
  • One Solution collect form web for “Tomcat Consumo di memory eccessivo”

    —- Edited per fornire esempio come il punto non sta attraversando —-

    Viene avviato un process che richiede 1 GB di memory.

    Quindi questo process inizia otto thread (tutti hanno accesso a 1 GB di memory allocata).

    Qualcuno gestisce uno strumento per determinare la quantità di memory utilizzata. Lo strumento funziona come segue:

    1. Trova each voce programmabile (each thread).
    2. Vedere quanta memory può accedere.
    3. Aggiungere quella memory insieme
    4. Segnala la sum.

    Lo strumento riferirà che il process utilizza 9 GB di memory, quando è (si spera) ovvio che ci sono otto thread generati (e il thread per il process originale) tutti utilizzando lo stesso GB di memory.

    È un difetto in come alcuni strumenti riportno la memory; tuttavia, non è un difetto facilmente riparabile (come la fissazione richiederebbe cambiare l'output di alcuni strumenti molto vecchi (ma importnti). Non voglio essere il tipo che riscrive la parte superiore o ps, renderebbe il sistema operativo non POSIX.

    —- L'articolo originale segue —- Alcune versioni degli strumenti di reporting della memory (come la parte superiore) confondono erroneamente i thread (tutti hanno accesso alla stessa memory) con i processi. Di conseguenza, un esempio di tomcat che spawn di cinque thread farà erroneamente il suo consumo di memory di cinque volte.

    L'unico modo per assicurarsi è di elencare i processi con il loro consumo di memory singolarmente e quindi leggere la memory per uno dei thread (che sta diventando elencati come un process). In questo modo conosci il vero consumo di memory dell'applicazione. Se ti basi sugli strumenti che fanno l'aggiunta per te, sovrastimere la quantità di memory effettivamente utilizzata dal numero di thread che si riferiscono alla stessa memory condivisa.

    Ho avuto scatole con 2 GB di memory (e 1 GB di swap) che ha riferito che ~ 7 GB di memory era in uso su una applicazione particolarmente pesanti di filo prima.

    Per una migliore comprensione di come la memory viene segnalata da molti strumenti, guardate qui . Se il codice python sta analizzando il text di uno di questi strumenti, o get i dati provenienti dallo stesso sistema, viene sottoposto agli stessi errori durante la segnalazione della memory.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.