У меня есть свежий сервер под управлением Ubuntu 11.04 (Natty) (64-разрядная версия). Я начал с установки openjdk
и tomcat6
. Когда сервер Tomcat запускается, он сразу использует 480+ МБ памяти. Это кажется несоразмерным, и мне интересно, есть ли у кого-нибудь решение, позволяющее использовать Tomcat 200-300 МБ (или меньше) памяти.
я использовал memtop чтобы увидеть это: (Примечание: я удалил все записи, кроме больших. Запись размером 499 МБ - это 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 %
Кроме того, вы можете увидеть, какие пакеты JDK и Tomcat я установил:
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
Сценарий запуска для Tomcat устанавливает Xmx
к 128 млн:
JAVA_OPTS="-Djava.awt.headless=true -Xmx128M"
Есть ли у кого-нибудь идеи, что я могу сделать, чтобы снизить потребление памяти до чего-то более разумного? Я не понимаю, почему JVM и Tomcat вместе должны потреблять столько памяти.
РЕДАКТИРОВАТЬ
Черт возьми, я скачал Tomcat 6 напрямую и запустил сценарий запуска. Имейте в виду, что нет Xmx значение было установлено на этот раз. При запуске этого memtop показывает, что Tomcat использует 737 МБ стоит памяти!
Это заставляет меня думать, что есть проблема с openjdk используя серьезный объем памяти для JVM.
Я попробовал то же самое с новой загрузкой .zip файла Tomcat 7 - та же проблема. Он использовал 740 МБ памяти.
Я установил Sun JRE / JDK. Потребление памяти упало примерно до 400 МБ (по сравнению с почти 500 МБ). Это по-прежнему больше использования памяти, чем я бы предпочел!
(солнце-java6-bin, солнце-java6-jdk, солнце-java6-jre)
Когда я бегу top
, Я получаю это:
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
Я понимаю и ожидаю, что 64-битная машина / JVM будет использовать больше памяти, но я не ожидал, что она будет такой большой. Я работаю на виртуальной машине, которая гарантирует мне только 512 МБ.
---- Отредактировано, чтобы предоставить пример, поскольку точка не встречается ----
Запускается процесс и запрашивает 1 ГБ памяти.
Затем этот процесс запускает восемь потоков (каждый из которых имеет доступ к выделенному 1 ГБ памяти).
Кто-то запускает инструмент, чтобы определить, сколько памяти используется. Инструмент работает следующим образом:
Инструмент сообщит, что процесс использует 9 ГБ памяти, когда (надеюсь) очевидно, что существует восемь порожденных потоков (и поток для исходного процесса), использующих один и тот же ГБ памяти.
Это дефект в том, как некоторые инструменты сообщают о памяти; однако это нелегко исправить (поскольку для его устранения потребуется изменить вывод некоторых очень старых (но важных) инструментов). Я не хочу быть тем, кто переписывает top или ps, это сделало бы ОС не-POSIX.
---- Исходный пост следует ---- Некоторые версии инструментов отчетов о памяти (например, top) ошибочно путают потоки (все они имеют доступ к одной и той же памяти) с процессами. В результате экземпляр tomcat, который порождает пять потоков, неверно сообщит о потреблении памяти в пять раз.
Единственный способ убедиться в этом - перечислить процессы с учетом их потребления памяти по отдельности, а затем прочитать память для одного из потоков (который отображается в списке как процесс). Таким образом вы узнаете истинное потребление памяти приложением. Если вы полагаетесь на инструменты, которые делают это за вас, вы переоцените объем памяти, фактически используемый количеством потоков, ссылающихся на одну и ту же общую память.
У меня были коробки с 2 ГБ памяти (и 1 ГБ подкачки), в которых сообщалось, что раньше использовалось ~ 7 ГБ памяти для приложения с особенно тяжелыми потоками.
Чтобы лучше понять, как многие инструменты сообщают о памяти, Смотри сюда. Если код Python анализирует текст одного из этих инструментов или получает эти данные из одних и тех же системных вызовов, то он подвержен тем же ошибкам при переполнении памяти.