Использование памяти Java с нативными процессами - PullRequest
4 голосов
/ 19 июня 2009

Каков наилучший способ настройки серверного приложения, написанного на Java, в котором используется нативная библиотека C ++?

Среда представляет собой 32-разрядную машину Windows с 4 ГБ ОЗУ. JDK это вс 1.5.0_12.

При запуске Java-процессу выделяется 1024 МБ памяти (-Xmx), но я часто вижу ошибки OutOfMemoryErrors из-за недостатка места в куче. Если объем памяти увеличивается до 1200 МБ, ошибки OutOfMemoryErses возникают из-за недостатка места подкачки. Как распределяется память между JVM и собственным процессом?

Имеет ли переключатель Windows / 3GB какое-либо влияние на собственные процессы и Sun JVM?

Ответы [ 4 ]

2 голосов
/ 20 июня 2009

У меня было много проблем с этим параметром (Java на 32-битных системах - msw и др.), И все они были решены путем резервирования JVM чуть менее 1 ГБ ОЗУ.

В противном случае, как указано, фактическая занятая память в системе для этого процесса будет превышать 2 ГБ; в тот момент у меня была «тихая смерть» процесса - без ошибок, без предупреждений, просто процесс завершался очень тихо.

Я получил больше стабильности и производительности при работе нескольких JVM (каждая с объемом оперативной памяти менее 1 ГБ) в одной системе.

1 голос
/ 20 июня 2009

Я нашел некоторую информацию по управлению памятью JNI здесь , а вот раздел JVM JNI по управлению памятью .

Хорошо, если пользовательское пространство объемом 3 ГБ превышает пространство для пользователя 2 ГБ, это может помочь, но если у вас возникли проблемы с нехваткой пространства подкачки на 2 ГБ, я думаю, что 3 ГБ только ухудшат ситуацию. Насколько большой ваш файл подкачки? Это максимизировано?

Вы можете лучше понять распределение кучи, подключив jconsole к jvm.

0 голосов
/ 21 июня 2009

Вы, к сожалению, недостаточно хорошо объяснили свою проблему. Реальный вопрос заключается в том, почему процесс Java так сильно растет. У вас есть утечка памяти? У вас есть реальная причина, чтобы иметь столько данных в JVM?

Распределяет ли библиотека C ++ свою собственную память из стека C, или она выделяет память из пространства объектов Java, или она делает что-то еще полностью?

0 голосов
/ 19 июня 2009

Как распределяется память между JVM и собственным процессом?

Сборщик мусора в JVM от Sun использует метку-разметку с опциями включения одновременного и инкрементального сбора мусора.

Ну, точнее, он инсценирован, и вышесказанное относится только к объектам с длительным сроком службы. Для молодых объектов GC по-прежнему выполняется с помощью коллектора остановки и копирования, который намного лучше подходит для работы с недолговечными объектами (и все типичные программы Java создают много недолговечных объектов).

Копирующий сборщик обходит все элементы в куче, копируя их в новую кучу, если на них есть ссылки, а затем отбрасывает прежнюю кучу. Таким образом, 1М живых объектов требует до 2М реальной памяти: если каждый объект жив, во время сбора мусора будет две копии всего.

Таким образом, JVM требует гораздо больше системной памяти, чем доступно для кода, работающего на виртуальной машине, поскольку это приводит к существенным накладным расходам на управление и сборку мусора.

Имеет ли переключатель Windows / 3GB какое-либо влияние на собственные процессы и Sun JVM?

/3GB позволяет адресному пространству виртуальной памяти пользователя быть 3 ГБ, но только для исполняемых файлов, заголовки которых отмечены IMAGE_FILE_LARGE_ADDRESS_AWARE. Насколько я знаю, Sun's java.exe нет. У меня нет системы Windows, поэтому я не могу подтвердить.

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