Я купил виртуальный сервер с 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 м, и вы должны приблизиться, но это действительно будет зависеть от вашего приложения.