Вчера я разместил этот вопрос: Tomcat чрезмерное потребление памяти
Цепочка становилась слишком длинной и подробной, чтобы кто-либо мог продолжать помогать. Итак, теперь я задаю более конкретный вопрос.
Когда я бегу top
, Я получаю это:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13749 tomcat6 20 0 493m 82m 9972 S 0 9.0 0:07.34 java
Это свежая установка Tomcat6 на Ubuntu 11.04 (Nattty) (64-разрядная версия).
Насколько я понимаю, VIRT - это виртуальная память. 493 м в столбце VIRT - это «нормально» или это слишком много? Имейте в виду, что сейчас в Tomcat нет запущенных веб-приложений. Это просто базовая ванильная установка.
Как насчет 82м в колонке RES? Что это означает и как это соотносится с VIRT? Я ожидаю, что Tomcat будет использовать именно такой объем памяти.
Моя хостинговая компания использует Parallels Virtuozzo Containers, и, по всей видимости, предоставляемая мне статистика использования памяти откуда-то берется. Статистика, которую они мне показывают, заключается в том, что я использую 110% от моего предела памяти в 512 МБ (с возможностью увеличения объема). Фактически они рассчитывают от Tomcat на 400-500 МБ памяти.
Jvm - это среда с голодным объемом памяти, и 512 мегабайт, вероятно, слишком мало для ОС плюс jvm, на котором запущено приложение среднего размера. Кроме того, если вы нацелены на столь низкое потребление памяти, вам следует использовать 32-битную версию как ОС, так и JRE. Вы также можете попробовать контейнер с меньшей занимаемой площадью, например Jetty.
Я нахожусь в той же ситуации, что и вы: виртуальный сервер, размещенный на Parallels Virtuozzo Containers.
У меня установлены Debian 6 и Tomcat 7, запущены приложения по умолчанию и два дополнительных небольших. Конфигурация Tomcat 7 немного изменена, но все еще очень похожа на конфигурацию по умолчанию:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29910 tomcat 18 0 525m 80m 9972 S 0.0 7.9 0:13.26 java
Так что это кажется вполне нормальным. Я предполагаю, что вы уже сейчас, как ограничить использование памяти для Tomcat с помощью JAVA_OPTS = '- Xms256m -Xmx256m'?
Я не уверен, насколько вы знакомы с Tomcat, лично я всегда считаю этот FAQ полезным: http://wiki.apache.org/tomcat/HowTo http://wiki.apache.org/tomcat/HowTo#Where_and_how_do_I_set_memory_related_settings_to_improve_Tomcat_performance.3F
С уважением, Клод
Недавно я получил VPS с 392 МБ и установил Ubuntu 10.04 + Sun JDK 6 + vanilla Tomcat 6.0.32.
Еще я был удивлен, когда увидел, что установка Tomcat по умолчанию кушает 384-400 МБ
root@mybox:# top | grep java
32321 root 18 0 384m 121m 9996 S 0.0 31.7 0:12.24 java
Следующий сценарий определяет реальную память, которую использует VPS, и доказывает, что у меня заканчиваются мои 392 МБ.
#!/bin/bash
bean=`cat /proc/user_beancounters`
guar=`echo "$bean" | grep vmguar | awk '{ print $4;}'`
burst=`echo "$bean" | grep privvm | awk '{ print $5;}'`
priv=`echo "$bean" | grep privvm | awk '{ print $2;}'`
let total=guar/256
let used=priv/256
let burst=burst/256
echo "VPS memory usage:"
echo "Used: $used MB"
echo "Total: $total MB"
echo "Burstable to: $burst MB"
Я поместил JAVA_OPTS = '- Xms128m -Xmx192m' в / etc / environment, но это не помогло.
Я начал гуглить решение и наткнулся на ваш пост, так что, по крайней мере, я не одинок.
В моем приложении j2ee используется openJPA, который также потребляет много памяти, поэтому я думаю, что мне нужно будет добавить еще 256 МБ.
ВИЭ знак равно ВИЭИдентификатор Размер (какая часть вашей программы находится в реальной физической памяти.
ВИРТ знак равно ВИРТual Memory Footprint (сколько виртуальной памяти, RAM + Swap, выделено вашей программой).
Это нормально? Может быть, а может и нет.
Перезапустите tomcat. Существенно ли меньше размер VIRTual? Он растет со временем? Если это так, у вас есть утечка памяти (либо в Tomcat, либо в вашем приложении).
Вы можете справиться с этим, покопавшись в коде, чтобы найти утечку, или запланировав периодические перезапуски. Первое - ПРАВИЛЬНЫЙ способ, второе - БЫСТРЫЙ.
Если виртуальный размер вашего процесса tomcat остается таким же после перезапуска или увеличивается до фиксированной точки и не становится больше, у вас нет классической утечки памяти: ваше приложение просто любит использовать много памяти.
Вы можете провести рефакторинг, чтобы использовать меньше памяти, или обновить свой план хостинга, чтобы использовать больше памяти, не превышая свой лимит.
Поскольку вы говорите, что сейчас в Tomcat нет запущенных приложений, это может быть просто объем памяти, который Java захватывает по умолчанию для кучи JVM при запуске. Этот размер можно настроить (с помощью параметров Java. См. Руководство пользователя Tomcat и другие документы для информации).