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

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

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

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

4
parkr 19 Июн 2009 в 06:08

4 ответа

Лучший ответ

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

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

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

2
gvlx 19 Июн 2009 в 20:43

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

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

0
vy32 21 Июн 2009 в 04:20

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

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

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

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

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

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

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

0
ephemient 19 Июн 2009 в 03:59

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

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

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

1
Community 23 Май 2017 в 12:08