Java выделяет дополнительные 2 ГБ памяти - PullRequest
6 голосов
/ 12 марта 2012

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

java -Xmx512M -jar program.jar

На нашем старом VPS вы можете использовать команду top, чтобы узнать, сколько виртуальной и резидентной памяти используется.Было бы использовать как 600-700 МБ виртуальной памяти.Теперь на нашем новом VPS с этой же командой виртуальная память, кажется, всегда на ~ 2 ГБ больше значения -Xmx.Таким образом, вместо виртуальной памяти около 600-700 МБ, вместо 2700-3000 МБ.

Старый VPS работает под CentOS 5.7, а новый - CentOS 6.2.Оба работают под управлением JRE 1.7u3 64bit.

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

edit: top

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.Я спрашиваю, почему он использует гораздо больше, чем раньше.

Ответы [ 2 ]

4 голосов
/ 12 марта 2012

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

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

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

1 голос
/ 12 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...