JVM Heapsize на 32-битной ОС - PullRequest
       63

JVM Heapsize на 32-битной ОС

2 голосов
/ 02 ноября 2010

Я использую 32-битную Win.7 и Eclipse. Также имеется 4 ГБ оперативной памяти.

Я хочу выделить моему java-приложению максимальный размер кучи около 3 ГБ, но я могу выделить максимум 1,5 ГБ через аргументы ВМ -Xmx1056m.

Что мне делать? Если я установлю 64-битную win.7. тогда можно было бы выделить 3 ГБ к моему приложению?

Ответы [ 4 ]

3 голосов
/ 02 ноября 2010

Обычный 32-разрядный процесс Windows может адресовать только 2 ГБ памяти, даже если у вас есть больше доступной памяти.Вы можете найти пределы памяти для разных версий Windows здесь .

Поскольку виртуальной машине нужна память для большего, чем просто для кучи, максимальный размер кучи будет немного меньше, чем максимальный доступный объем памятик процессу.Обычно для 32-разрядной виртуальной машины Windows можно изменить размер кучи примерно до 1,6 ГБ.

2 голосов
/ 02 ноября 2010

Вам нужно 64-битная ОС и 64-битная виртуальная машина, чтобы выделить столько оперативной памяти.

0 голосов
/ 02 ноября 2010

У меня нет ссылки, которая описывает процесс управления памятью JVM.Ограничение, на которое вы наткнулись, является ограничением того, как Java выполняет сборку мусора.Куча памяти Java должна быть неуклюжим блоком.Алгоритмы сбора мусора были оптимизированы для этого ограничения дизайна, чтобы они могли работать эффективно.В 32-битной операционной системе вы не контролируете, в какие адреса памяти загружаются драйверы устройств.В Windows ОС перераспределяет базовый адрес драйвера устройства, хранящийся в DLL, только если он конфликтует с уже загруженным кодом.Другие операционные системы могут перераспределять все драйверы устройств под нагрузкой, чтобы они находились в непрерывном блоке рядом с ядром.

В основном, ограничение одинаково для 64-битных и 32-битных операционных систем.Просто на 64-битной ОС есть еще несколько диапазонов адресов на выбор.Убедитесь, что вы используете 64-битную JVM для соответствия ОС.Вот почему 64-битная ОС способна найти более крупный блок адресов памяти, чем 32-битная ОС.

РЕДАКТИРОВАТЬ: Кроме того, 32-битная JVM имеет ограничение максимального размера кучи 2 ГБ.

СПРАВКА:

http://publib.boulder.ibm.com/infocenter/javasdk/tools/index.jsp?topic=/com.ibm.java.doc.igaa/_1vg00014884d287-11c3fb28dae-7ff6_1001.html

Максимальная память Java в Windows XP

http://forums.sun.com/thread.jspa?messageID=2715152#2715152

0 голосов
/ 02 ноября 2010

Вам потребуется не только 64-битная ОС и 64-битная виртуальная машина, но и больше памяти.

В 32-битной системе Windows виртуальное адресное пространство разделено на 2 ГБ для операций ядра и 2 ГБ для пользовательских приложений. Итак, ты облажался.

Существует один возможный, но очень маловероятный обходной путь: вы можете включить переключатель / 3GB , чтобы снять это ограничение и заставить систему выделить 1 ГБ виртуального адресного пространства для операций ядра и 3 ГБ для пользовательских приложений (если они / LARGEADDRESSPACEAWARE ).

К сожалению, 32-битная JVM Sun / Oracle HotSpot не является LARGEADDRESSAWARE (насколько я знаю), и другие 32-битные JVM, скорее всего, тоже нет.

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

Просто получите операционную систему 64bis с большим объемом оперативной памяти. Это все, что вам нужно, если не считать, как ваша программа использует меньше памяти.

...