Como reduzir a memória usada pelo Tomcat?

4

Comprei um servidor virtual com 1GB de memória para executar o aplicativo do site java. Eu instalei o Tomcat 6.0.33. Cada vez que eu tomo o tomcat, ele leva em torno de 450 mb de memória.

Eu tentei de tudo para reduzir isso, eu configurei o CATALINA_OPS como

export CATALINA_OPTS="-Xms256m -Xmx256m"

Eu criei o arquivo setenv.sh e coloquei nele:

JAVA_HOME="/usr/local/java"
export JAVA_HOME

JAVA_OPTS="-Xmx256m -Xms256m"
export JAVA_OPTS

CATALINA_HOME="/usr/local/tomcat"
export CATALINA_HOME

Quando eu passar este comando: ps -ef | grep tomcat eu tenho:

root      3150     1  5 15:32 pts/0    00:00:18 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Xmx256m -Xms256m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms256m -Xmx256m -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root      3217  2041  0 15:37 pts/0    00:00:00 grep tomcat

que mostra que meus parâmetros são realmente usados.

Existe algum método para reduzir a memória consumida pelo tomcat? Obrigado.

    
por stunaz 18.09.2011 / 21:40

1 resposta

7

O problema aqui não é realmente o tomcat, é o java em geral. Há vários lugares diferentes em que o java usa memória. O java runtime usa sua própria memória e isso será incluído no seu número; além disso, o java divide a memória em quatro locais distintos:

The Heap: This is the memory used to store your objects and is controlled by the -Xms and -Xmx parameters.

The Stack: This is the memory used to store the stack frames for the threads that your program maintains and can be controlled with the -Xss parameter.

Permgen Memory: This is the memory used to store your compiled classes and pooled strings as well as some other things and can usually be controlled with -XX:MaxPermSize although the -XX represents a debugging parameter, so there's no guarantee it's on all JVM's. But, the default Sun/Oracle reference implementations have always had them.

JNI Allocated Memory Any classes utilizing native methods and JNI could potentially allocate unlimited memory. This memory comes from the OS and not the heap and there's no way of knowing how much memory a native class will use without having access to the source.

Uma visão geral do modelo de memória java provavelmente está além do escopo da resposta a essa pergunta e eu não consegui encontrar um artigo / descrição bem conciso na internet, mas a resposta curta para sua pergunta é se você está tentando limitar a quantidade absoluta de memória usada por um programa java, não há maneira fácil de fazê-lo. Heuristicamente, provavelmente reduza os parâmetros -Xms e -Xmx para 128m e você deve se aproximar, mas isso vai depender da sua aplicação.

    
por 18.09.2011 / 22:31