Инструменты для просмотра / устранения фрагментации памяти Windows XP

StackOverflow https://stackoverflow.com/questions/103622

Вопрос

У нас есть 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 procexp сообщают о 2000 МБ свободной памяти.Я посмотрел на этот вопрос касался внутренней фрагментации

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

Я работал над аналогичной проблемой на работе.Я обнаружил, что запуск программы с использованием WinDbg и использование команд "!address" и "!address -summary" оказали неоценимую помощь в выяснении причин фрагментации виртуального адресного пространства процессов.Вы также можете попробовать запустить программу после перезагрузки и использовать команду "!address", чтобы сфотографировать адресное пространство, а затем сделать то же самое, когда программа больше не будет запускаться.Это может помочь вам разобраться в проблеме.Возможно, что-то простое, например, загрузка дополнительной библиотеки DLL, может вызвать проблему.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top