Инструменты для просмотра / решения фрагментации памяти Windows XP - PullRequest
5 голосов
/ 19 сентября 2008

У нас есть 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 ]

2 голосов
/ 19 мая 2009

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

2 голосов
/ 19 сентября 2008

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

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

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

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

2 голосов
/ 19 сентября 2008

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

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

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

0 голосов
/ 11 октября 2011

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

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

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