2008-09-19 6 views
5

У нас есть Java-программа, которая требует большого количества кучи - мы начинаем с (среди других аргументов командной строки) аргумент -Xmx1500m, который определяет максимальное кучное пространство 1500 MB. При запуске этой программы в Windows XP, которая была перезагружена, она запускается и запускается без проблем. Но если программа запуска несколько раз, компьютер был на некоторое время, и т.д., когда он пытается запустить я получаю эту ошибку:Инструменты для просмотра/устранения фрагментации памяти 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 МБ. Я посмотрел на this question related to internal fragmentation

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

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

ответ

2

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

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

Ваш лучший выбор, если вам действительно нужно больше 1.2G памяти для вашего java-приложения - это посмотреть на 64-битные окна или Linux или OSX. Если вы используете какие-либо родные библиотеки с вашим приложением, вам придется перекомпилировать их на 64 бит, но это будет намного проще, чем пытаться переупаковать dll и прочее, чтобы максимизировать память, которую вы можете получить на 32-битных окнах ,

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

0

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

0

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

2

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

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

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

2

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

0

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