Вопрос по java, windows – Инструменты для просмотра / решения фрагментации памяти Windows XP

5

У нас есть Java-программа, которая требует большого объема кучи - мы запускаем ее (среди прочих аргументов командной строки) с аргументом -Xmx1500m, который задает максимальный объем кучи, равный 1500 МБ. При запуске этой программы на только что перезагруженном компьютере с Windows XP она запускается и запускается без проблем. Но если программа запускалась несколько раз, компьютер некоторое время работал и т. Д., Когда он пытается запустить, я получаю эту ошибку:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Я подозреваю, что сама Windows страдает от фрагментации памяти, но я не знаю, как подтвердить это подозрение. В это время диспетчер задач и sysinternals procxp сообщают о свободной памяти в 2000 МБ. Я смотрел наэтот вопрос связан с внутренней фрагментацией

Итак, первый вопрос: как я могу подтвердить свое подозрение? Второй вопрос: если мои подозрения верны, кто-нибудь знает какие-либо инструменты для решения этой проблемы? Я немного осмотрелся, но не нашел ничего, что могло бы помочь, кроме периодических перезагрузок машины.

PS - изменение операционной системы также в настоящее время не является жизнеспособным вариантом.

Ваш Ответ

6   ответов
0

Используйте vmmap из инструментов Microsoft SysInternals для просмотра фрагментации виртуального адресного пространства и определения того, что разбивает пространство

2

Согласитесь с Torlack, во многом это связано с тем, что другие DLL загружаются и попадают в определенные места, разбивая объем памяти, который вы можете получить для виртуальной машины, в один большой блок.

Вы можете поработать над WinXP, если у вас есть больше, чем 3G памяти, чтобы переместить некоторые вещи Windows, посмотрите PAE здесь: http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx

Лучше всего, если вам действительно нужно больше 1,2 ГБ памяти для вашего Java-приложения, это посмотреть на 64-битные окна, Linux или OSX. Если вы используете в своем приложении какие-либо нативные библиотеки, вам придется перекомпилировать их для 64-битных систем, но это будет намного проще, чем пытаться перебазировать библиотеки и прочее для максимизации памяти, которую вы можете получить в 32-битных окнах. ,

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

0

http://minimem.kerkia.net/) для этого приложения может решить вашу проблему. Однако я не уверен, что это именно тот ответ, который вы ищете. Я надеюсь, что это помогает.

0

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

2

Я подозреваю, что проблема заключается в фрагментации памяти Windows. В StackOverflow есть еще один вопрос, который называетсяМаксимальная память Java в Windows XP в нем упоминается использование Process Explorer для просмотра того, где библиотеки DLL отображаются в памяти, а затем для решения проблемы путем перебазирования библиотек DLL, чтобы загружать их в память более компактным способом.

2

Если у вас недостаточно свободного места на странице, эта проблема не связана с тем, что на компьютере недостаточно памяти. Весь смысл виртуальной памяти состоит в том, чтобы позволить процессам использовать больше виртуальной памяти, чем физически доступно.

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

Я работал над аналогичной проблемой на работе. Я обнаружил, что запускаю программу с использованием WinDBG и с помощью & quot;! Address & quot; и & quot;! address -summary & quot; Команды были неоценимы в отслеживании, почему процессы & apos; виртуальное адресное пространство стало фрагментированным. Вы также можете попробовать запустить программу после перезагрузки и использовать & quot;! Адрес & quot; Команда, чтобы сделать снимок адресного пространства, а затем сделать то же самое, когда программа больше не работает. Это может подсказать вам проблему. Может быть, что-то простое, как дополнительная загрузка DLL, может вызвать проблему.

Похожие вопросы