2012-03-12 5 views
6

У меня есть новый VPS для запуска некоторых программ Java, которые я и некоторые приятели сделали. Я начинаю процесс с линией, как это:Java выделяет дополнительные 2gb памяти

java -Xmx512M -jar program.jar 

На нашем старом VPS, вы можете использовать команду «сверху», чтобы увидеть, как использовалось много виртуальных и резидентный. Он будет использовать как 600-700 мб виртуальной памяти. Теперь на нашем новом VPS с той же командой виртуальная память всегда будет лишней ~ 2gb по значению -Xmx. Поэтому вместо виртуальной памяти около 600-700 мб, вместо 2700-3000mb.

Старый VPS работает CentOS 5.7, а новый работает CentOS 6.2. Оба работают на JRE 1.7u3 64bit.

Почему это и как я могу это исправить?

редактировать: топ

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
27645 pyro 20 0 3003m 270m 10m S 5.0 1.7 1:19.18 java -Xmx512M -jar cserver.jar 

другой редактировать: Я не подвергаю сомнению, почему виртуальная память использует больше памяти, чем указано в командной строке Java. Я задаюсь вопросом, почему он использует гораздо больше, чем раньше.

+1

Убедитесь, что ваш java-процесс определенно использует параметр Xmx512m, используя «ps -ef», а затем, если это действительно так, обновите свой вопрос с помощью вывода сверху. – Rich

+0

Если размер резидента составляет 270 МБ, а проблема с поисковым вызовом отсутствует, возникает ли проблема? –

+0

Если программа не изменилась со старого VPS и со старым VPS, виртуальная память будет использовать только ~ 600-700mb, тогда да что-то не кажется правильным. Как старый, так и новый VPS запускают одну и ту же ОС и одну и ту же версию Java. –

ответ

4

Куча не единственная вещь, которая потребляет виртуальную память. Виртуальная память - это количество адресного пространства, которое имеет приложение, а не объем используемой памяти (резидент - лучший индикатор).

В виртуальной памяти есть все пространство стека потоков, прямая память и файлы с отображением памяти.

Первое, что я хотел бы проверить, это количество потоков, которое использует ваше приложение, тем больше потоков, тем больше виртуальной памяти.

+0

Я знаю о виртуальной памяти. Мне просто интересно, почему он выделяет столько памяти на этом новом VPS. Оба VPS работают с той же версией Java (1.7u3) и той же ОС (CentOS 6.2). Кроме того, программа не изменилась с момента переключения VPS. –

+0

Если вы запустите 'pmap -x {pid}'. Часто, когда люди говорят, что ничего не изменилось, это означает, что они ничего не знают о том, что изменилось, но, очевидно, что-то есть. ;) –

+0

Спасибо за команду pmap. По-видимому, я был дезинформирован, один из моих приятелей сказал мне, что наш старый VPS был фактически CentOS 5.7, а не 6.2. Выяснилось, что «проблема» (которая вообще не является проблемой) связана с анонимным отображением кучи glibc 2.11. –

1

Использование виртуальной памяти означает, что адресное пространство используется и не обязательно переводится непосредственно в использование ОЗУ. Стек, сопоставленные файлы (включая двоичные файлы и библиотеки) и т. Д. Все вносят вклад в виртуальную память, но не всегда в используемую RAM. Обратите внимание, что использование памяти в режиме RES (резидентный RAM) является довольно приятным только 270 МБ. На 32-битной машине вы можете столкнуться с ограничениями на адресное пространство, поэтому виртуальная память - это дефицитный ресурс, если вы приблизитесь к отметке 2 ГБ (значение может также быть 1 ГБ или 3 ГБ в зависимости от ОС). В 64-битной системе виртуальная память (адресное пространство) близка к неограниченной, поэтому сама по себе высокая ценность не должна рассматриваться как риск. Конечно, если это также связано с фактическим использованием высокой ОЗУ или множеством сопоставленных файлов, которые вы не можете узнать, почему они используются, стоит посмотреть.

Конечно, JVM также имеет некоторые фактические накладные расходы (в физически выделенной памяти), связанные с хранением дома сборщика мусора, работой компилятора, собственным кодом и т. Д., И это также будет отражено в использовании виртуальной памяти. Но поскольку позиции RES и SHR не очень высоки, я бы сказал, что нет никаких оснований для паники, особенно если вы 64-бит.

Смежные вопросы