Использование памяти Java - PullRequest
3 голосов
/ 04 марта 2010

Я не могу понять использование памяти Java.У меня есть приложение, которое выполняется с максимальным объемом памяти, установленным на 256M.Тем не менее, в какой-то момент времени я вижу, что в соответствии с диспетчером задач это занимает до 700 МБ!

Нет необходимости говорить, что все остальные приложения немного не отвечают, когда это происходит, поскольку они, вероятно, меняются местамиout.

Это JDK 1.6 на WinXP.Есть идеи?

Ответы [ 5 ]

2 голосов
/ 04 марта 2010

Сконфигурированная память доступна для приложения. Это не будет включать

  1. размер JVM
  2. банок, загруженных в
  3. нативные библиотеки и связанная с ними выделенная память

, что приведет к гораздо большему изображению. Обратите внимание, что из-за того, как работают операционная система и JVM, 700 МБ могут быть разделены между несколькими JVM (из-за общих двоичных образов, общих библиотек и т.

2 голосов
/ 04 марта 2010

Сумма, которую вы указываете с -Xmx, предназначена только для кучи, доступной пользователю - пространства, в котором вы динамически создаете объекты времени выполнения.

Процесс Java будет использовать гораздо больше места для собственных нужд, включая JVM, программу и другие библиотеки, пул констант и т. Д.

Кроме того, из-за того, как работает система сбора мусора, может быть выделено больше памяти, чем в настоящее время в куче - она ​​просто еще не была возвращена.

Все это говорит о том, что установка вашей программы на максимальную кучу 256 МБ действительно снижает ее в современной системе. Для тяжелых программ вы можете запросить как минимум 1 Гб кучи.

Как вы упомянули, одной из возможных причин замедления является то, что часть памяти, выделенной для Java, выгружается на диск. В этом случае программа действительно начнет работать с диском, поэтому не переусердствуйте, если у вас мало физической памяти. В Linux вы можете получить статистику пропуска страниц для процесса, я уверен, что аналогичный способ есть в Windows.

1 голос
/ 04 марта 2010

Опция -Xmx ограничивает только размер кучи Java. В дополнение к куче java будет выделять память для других вещей, включая стек для каждого потока (2 КБ по умолчанию, установленный -Xss), PermGenSpace и т. Д. Таким образом, в зависимости от того, сколько потоков вы запускаете, количество классов, загружаемых вашим приложением, и некоторых других факторов, вы можете использовать намного больше памяти, чем ожидалось.

Также, как указывалось, диспетчер задач Windows может учитывать виртуальную память.

0 голосов
/ 04 марта 2010

А как насчет виртуальных страниц, которые он занимает? Я думаю, что Windows показывает вам полный набор всего агрегированного.

0 голосов
/ 04 марта 2010

Ты имеешь в виду кучу верно? Насколько я знаю, есть две вещи, о которых нужно позаботиться. Опция Xms, которая устанавливает начальный размер кучи Java, и опция Xmx, которая устанавливает максимальное пространство кучи Java. Если динамическая память превышает значение Xmx, должно быть исключение OutOfMemoryException.

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