Назад | Перейти на главную страницу

Как уменьшить объем памяти, используемый Tomcat?

Я купил виртуальный сервер с 1 ГБ памяти для запуска приложения веб-сайта Java. Я установил Tomcat 6.0.33. Каждый раз, когда я запускаю tomcat, он занимает около 450 МБ памяти.

Я попробовал все, чтобы уменьшить это, я настроил CATALINA_OPS как

export CATALINA_OPTS="-Xms256m -Xmx256m"

Я создал файл set setenv.sh и вставил в него:

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

JAVA_OPTS="-Xmx256m -Xms256m"
export JAVA_OPTS

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

Когда я передаю эту команду: ps -ef | grep tomcat у меня есть:

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

что показывает мне, что мои параметры действительно используются.

Есть ли способ уменьшить память, потребляемую tomcat? Спасибо.

Проблема здесь не на самом деле в коте, а в Java в целом. Есть несколько разных мест, где Java использует память. Среда выполнения java использует собственную память, и она будет включена в ваш номер, кроме того, java разбивает память на четыре отдельных места:

Куча: Это память, используемая для хранения ваших объектов и управляемая -Xms и -Xmx параметры.

Стек: Это память, используемая для хранения кадров стека для потоков, которые поддерживает ваша программа и которыми можно управлять с помощью -Xss параметр.

Пермгенская память: Это память, используемая для хранения ваших скомпилированных классов и объединенных строк, а также некоторых других вещей, и обычно ею можно управлять с помощью -XX:MaxPermSize Хотя -XX представляет параметр отладки, поэтому нет гарантии, что он присутствует на всех JVM. Но в стандартных эталонных реализациях Sun / Oracle они всегда были.

Выделенная память JNI Любые классы, использующие собственные методы и JNI, потенциально могут выделять неограниченную память. Эта память поступает из ОС, а не из кучи, и невозможно узнать, сколько памяти будет использовать собственный класс, не имея доступа к источнику.

Обзор модели памяти Java, вероятно, выходит за рамки ответа на этот вопрос, и я не смог найти хорошую краткую статью / описание в Интернете, но краткий ответ на ваш вопрос: если вы пытаетесь ограничить абсолютное объем памяти, используемый java-программой, нет простого способа сделать это. Эвристически, вероятно, вырежьте -Xms и -Xmx параметры до 128 м, и вы должны приблизиться, но это действительно будет зависеть от вашего приложения.