Инструменты для просмотра / устранения фрагментации памяти Windows XP
-
01-07-2019 - |
Вопрос
У нас есть 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, чтобы просмотреть фрагментацию виртуального адресного пространства и определить, что разбивает пространство