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


103

Мені завжди вдавалося виділити 1400 мегабайт для Java SE, що працює на 32-розрядної Windows XP (Java 1.4, 1.5 та 1.6).

java -Xmx1400m ...

Сьогодні я спробував той же варіант на новій машині Windows XP за допомогою Java 1.5_16 та 1.6.0_07 і отримав помилку:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Через спроби та помилки здається, що 1200 мегабайт - це найбільше, що я можу виділити на цій машині.

Будь-які ідеї, чому одна машина дозволить 1400, а інша лише 1200?

Редагувати: Машина має 4 Гб оперативної пам’яті з приблизно 3,5 ГБ, яку Windows може розпізнати.


Ви помітили б різницю в максимумі між запуском програми в 32-бітній оболонці або 64-бітній оболонці, принаймні за моїм досвідом, хоча 64-розрядні системи WindowsXP рідкісні.
djangofan

Відповіді:


124

Майте на увазі, що Windows має управління віртуальною пам’яттю і JVM потребує лише пам’яті, яка є суміжною у своєму адресному просторі . Таким чином, інші програми, що працюють в системі, не повинні обов'язково впливати на ваш розмір купи. Що вам заважатиме - це DLL-файли, які завантажуються у ваш адресний простір. На жаль, оптимізації в Windows, які мінімізують переїзд DLL під час посилання, роблять більш імовірним, що у вас буде фрагментований адресний простір. Окрім звичних речей, які, ймовірно, можуть входити у ваш адресний простір, це програмне забезпечення безпеки, програмне забезпечення CBT, шпигунське програмне забезпечення та інші форми зловмисного програмного забезпечення. Ймовірними причинами розбіжностей є різні патчі безпеки, версії виконання C та ін. Драйвери пристроїв та інші біти ядра мають власний адресний простір (інші 2 ГБ 32-бітного простору 4 ГБ).

Ви можете спробувати перейти через прив'язки DLL у процесі JVM і поглянути на спробу відновлення DLL-файлів на більш компактний адресний простір. Не весело, але якщо ви відчайдушно ...

Крім того, ви можете просто перейти на 64-бітну Windows та 64-розрядний JVM. Незважаючи на те, що пропонували інші, хоча це буде пережовувати більше оперативної пам’яті, у вас буде багато більше суміжного віртуального адресного простору, а виділення 2 Гб безперервно було б тривіальним.


5
Використовуйте Провідник процесів, щоб побачити, куди в пам'ять завантажуються файли dll. Часто якийсь оновлений драйвер буде триматися посередині вашого адресного простору. Використовуючи команду REBASE, ви можете легко їх відштовхнути. Майте на увазі, однак, dll підлягає оновленню і злам речі.
brianegge

2
Я ніколи не сприймав це як відповідь, і все ж stackoverflow позначив це як відповідь.
Стів Куо

@Christopher, чи можна використовувати 64-розрядний JVM на 32-розрядної Windows XP?
Pacerier

@Pacerier Вибачте, я пропустив ваш запит. AFAIK, це неможливо. В OS X були деякі хитрощі для 64-розрядного простору користувача з 32-бітовими ядрами, але я не чув про подібне для Windows.
Крістофер Сміт

@ChristopherSmith, Btw, ви згадали, що " інші програми, що працюють в системі, не повинні обов'язково впливати на ваш розмір купи ". Якщо так, то як ми пояснимо цей результат: stackoverflow.com/questions/9303889/… ?
Печер'є

50

Це стосується суміжної пам’яті.

Ось якусь інформацію я знайшов в Інтернеті для того, щоб хтось запитав, що раніше, нібито від "бога ВМ":

Причиною, що нам потрібна суміжна область пам’яті для купи, є те, що у нас є купа бічних структур даних, які індексуються (масштабованими) зміщеннями від початку купи. Наприклад, ми відстежуємо оновлення посилань на об'єкти за допомогою "масиву знаків картки", який має один байт на кожні 512 байти купи. Коли ми зберігаємо посилання в купі, ми повинні відзначити відповідний байт у масиві карткових марок. Ми праворуч зміщуємо адреса призначення магазину та використовуємо його для індексації масиву карткових знаків. Веселі адреси з арифметичними іграми, до яких ви не можете зайнятись на Java (доводиться :-) грати в C ++.

Зазвичай у нас немає проблем із скромними суміжними регіонами (до 1,5 Гб на Віндосі, до 3,8 Гб на Solaris. YMMV.). Проблема Windohs полягає в тому, що деякі бібліотеки завантажуються до запуску JVM, які розбивають адресний простір. Використання перемикача / 3GB не зможе відновити ці бібліотеки, тому вони все ще є проблемою для нас.

Ми знаємо, як зробити грубі кучки, але їх використання може бути непосильним. У нас більше запитів на швидше керування сховищами, ніж у великих круп в 32-розрядному JVM. Якщо вам дуже потрібні великі купи, перейдіть на 64-розрядний JVM. Нам все ще потрібна суміжна пам'ять, але набагато простіше потрапити в 64-бітний адресний простір.


Це дуже цікаво. Я завжди питав себе, чому 1500 МБ, тепер я отримав це, дякую!
Тім Бют

3
Вибачте за продовження старого питання, але це найкраща відповідь, яку я бачив досі. Але чому JVM виходить з ладу при запуску, якщо він не може отримати максимальний розмір купи? Чи не слід це спокійно погоджуватися на найкращий розмір вище мінімуму ?
Стробоскоп

19

Обмеження розміру купи Java для Windows:

  • максимально можливий розмір купи на 32-бітному Java: 1,8 ГБ
  • рекомендований обмеження розміру купи на 32-бітному Java: 1,5 ГБ (або 1,8 ГБ з опцією / 3 ГБ)

Це не допоможе вам отримати більшу купу Java, але тепер ви знаєте, що не можете вийти за рамки цих значень.


10

Oracle JRockit , який може обробляти безперервну купу, може мати розмір купи Java 2,85 ГБ у Windows 2003 / XP за допомогою перемикача / 3 Гб. Здається, що фрагментація може мати досить великий вплив на те, наскільки великою може бути купа Java.


6

JVM потребує суміжної пам’яті і залежно від того, що ще працює, що працювало раніше, і як Windows управляє пам’яттю, можливо, ви зможете отримати до 1,4 Гб суміжної пам’яті. Я думаю, що 64-бітова Windows дозволить купувати більші купи.


2
Я думаю, що сучасна операційна система імітує постійну пам'ять для. Оскільки 80486 архітектура x86 підтримує пейджингові виклики, щоб полегшити перестановку фізичної пам'яті.
Менмент

3
Mnemeth: По-перше, у WINAPI є специфічний API (AllocateUserPhysicalPages) для вдосконалених інструментів, таких як бази даних та віртуальних машин, які краще керувати самою пам’яттю, а Windows перешкоджати. По-друге, пейджинг - це функція захищеного режиму 80386, а не 80486.
Тамас Цінеге

6

Сонячному JVM потрібна суцільна пам'ять. Таким чином, максимальний об'єм пам'яті диктується фрагментацією пам'яті. Особливо дріллі драйверів, як правило, фрагментують пам'ять під час завантаження в якусь попередньо задану базову адресу. Тож ваше обладнання та його драйвери визначають, скільки пам’яті ви можете отримати.

Два джерела для цього із заявами інженерів Sun: блог на форумі

Може бути, інший JVM? Ви пробували Гармонію ? Я думаю, що вони планували дозволити безперервну пам'ять.


Але мені вдалося виділити 1300 МБ на машину з лише 1 Гб оперативної пам’яті (плюс віртуальна пам’ять). Мій 2 Гб оперативної пам’яті (також з віртуальною пам’яттю) може виділити лише 1200 МБ.
Стів Куо

Гармонія мертва, чи не так?
Pacerier

Так: "Apache Harmony виходить на пенсію в програмному фонді Apache з 16 листопада 2011 року."
боббел

3

Я думаю, це має більше спільного з тим, як налаштовано Windows, як натякає ця відповідь: Java -Xmx Option

Ще кілька тестів: мені вдалося виділити 1300 Мб на старій машині Windows XP з лише 768 Мб фізичної оперативної пам’яті (плюс віртуальної пам’яті). На моїй 2 Гб оперативної пам’яті я можу отримати лише 1220 МБ. На різних інших корпоративних машинах (зі старими Windows XP) мені вдалося отримати 1400 МБ. Машина з обмеженням 1220 Мб є доволі новою (тільки що придбана у Dell), тому, можливо, вона має новіші (і більш роздуті) Windows та DLL (вона працює під керуванням Window XP Pro Version 2002 SP2).


Це може вплинути і на ваші налаштування віртуальної пам'яті.
скафман

Усі машини, з якими я тестую, мають віртуальну пам'ять щонайменше вдвічі, ніж фізична ОЗУ.
Стів Куо

зауважте, що ви дійсно ніколи не хочете по-справжньому використовувати віртуальну пам’ять з java, тому що продуктивність GC стане дуже поганою. Об'єм пам'яті залежить від того, який dll вже завантажений та фрагментар пам'яті.
kohlerm

2

Я отримав це повідомлення про помилку під час запуску програми java з (обмеженою пам'яттю) virtuozzo VPS. Я не вказував жодних аргументів пам’яті, і виявив, що мені потрібно було явно встановити невелику суму, оскільки за замовчуванням, мабуть, було занадто багато. Напр. -Xmx32m (очевидно, це потрібно налаштувати в залежності від програми, яку ви виконуєте).

Просто поклавши це на той випадок, якщо хтось інший отримає вищезгадане повідомлення про помилку, не вказуючи великий об'єм пам'яті, як це робив запитувач.


1

JDK / JRE сонця потребує постійної кількості пам'яті, якщо виділити величезний блок.

ОС і початкові програми, як правило, виділяють біти і шматочки під час завантаження, які фрагментують наявну оперативну пам'ять. Якщо суміжний блок НЕ доступний, SUN JDK не може його використовувати. JRockit від Bea (придбаний Oracle) може виділяти пам'ять з частин.


1

Всі, здається, відповідають на суміжну пам’ять, але знехтували визнати більш нагальну проблему.

Навіть при 100% суміжному розподілі пам’яті ви не можете мати розмір куки в 2 Гб на 32-бітній ОС Windows (* за замовчуванням). Це пояснюється тим, що 32-бітні процеси Windows не можуть займати більше 2 Гб простору.

Процес Java буде містити perm gen (до Java 8), розмір стека на потік, накладні витрати JVM / бібліотеки (що значно збільшується з кожною збіркою), все крім купи .

Крім того, прапорці JVM та їхні значення за замовчуванням змінюються між версіями. Просто запустіть наступне, і ви отримаєте деяке уявлення:

 java -XX:+PrintFlagsFinal

Багато варіантів впливають на поділ пам’яті в купі та поза нею. Залишаючи вам більше або менше цих 2 Гб грати з ...

Щоб повторно використовувати частини цієї моєї відповіді (про Tomcat, але стосується будь-якого процесу Java):

Операційна система Windows обмежує розподіл пам'яті 32-бітного процесу загалом на 2 Гб (за замовчуванням).

[Ви зможете лише] виділити близько 1,5 ГБ простору купи, тому що для цього процесу також виділяється інша пам'ять (накладні витрати JVM / бібліотеки, простір генеалогічної генерації тощо).

Чому 32-розрядна Windows накладає обмеження на 2 ГБ адресного простору, а 64-бітна Windows обмежує 4 ГБ?

Інші сучасні операційні системи [кашлюють Linux] дозволяють 32-бітним процесам використовувати весь (або більшість) адресного простору 4 Гб.

Однак, 64-розрядні ОС Windows можуть бути налаштовані так, щоб збільшити ліміт 32-бітних процесів до 4 ГіБ (3 ГБ на 32-бітному):

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx


1
Ця відповідь стосується лише того, чому він може виділити лише 2 ГБ, а не чому він може виділити 1,4 ГБ на одному комп’ютері та лише 1,2 ГБ на іншому. Він не визначає ваші обмеження 1,5 ГБ, 2 ГБ або 4 ГБ, зазначені тут.
vapcguy

1
Абзац на прапорах JVM певним чином пояснює, чому пам’ять може відрізнятися між версіями. Також відзначте мій погляд на те, як налаштування купи завжди є (великою) часткою від загального розміру процесу - тому встановлення нижче, яке може все-таки досягати межі процесу 2 ГБ, - інше може бути обмежене безперервним розподілом пам'яті.
Майкл

Або, можливо, обмеження 1,5 ГБ на той розподіл 1,4 ГБ, який він робить. Зараз має більше сенсу - дякую за це роз’яснення.
vapcguy

0

Ось як збільшити розмір підкачки

  1. клацніть правою кнопкою миші на мій комп'ютер ---> властивості ---> Додатково
  2. у розділі продуктивності натисніть Налаштування
  3. натисніть вкладку Додатково
  4. у розділі Віртуальна пам'ять натисніть кнопку Змінити. Він покаже поточний розмір підкачки ур.
  5. Виберіть Диск, де є місце на жорсткому диску.
  6. Надайте початковий розмір та максимальний розмір ... наприклад початковий розмір 0 МБ та максимальний розмір 4000 МБ. (Стільки, скільки вам потрібно)

0

** Існує чимало способів зміни розміру купи,

  1. file-> settings-> build, excelletion, installation-> компілятор, тут ви знайдете розмір купи
  2. file-> налаштування-> збірка, виняток, розгортання-> компілятор-> andriod і тут ви знайдете розмір купи. Ви можете віднести це до проекту andriod, якщо у вас виникли проблеми.

Що для мене працювало

  1. Встановіть належний відповідний шлях JAVA_HOME у випадку, якщо ви оновили Java.

  2. створити нову системну змінну комп'ютера -> властивості-> розширені налаштування- > створити нову змінну системи

ім'я: _JAVA_OPTION значення: -Xmx750m

FYI: ви можете знайти VMoption за замовчуванням у довідці Intellij- > редагувати спеціальний параметр VM. У цьому файлі ви бачите мінімальний та максимальний розмір купи. **


-1

По-перше, використання файлу сторінки при наявності 4 ГБ оперативної пам’яті марно. Windows не може отримати доступ до 4 Гб (фактично менше через отвори в пам'яті), тому файл сторінки не використовується.

По-друге, адресний простір розділений на 2, половина для ядра, половина для режиму користувача. Якщо вам потрібно більше оперативної пам’яті для ваших додатків, використовуйте параметр / 3GB в boot.ini (переконайтеся, що java.exe позначений як «відома велика адреса» (Google для отримання додаткової інформації).

По-третє, я думаю, що ви не можете виділити повний 2 Гб адресного простору, оскільки java витрачає деяку кількість пам’яті внутрішньо (для потоків, компілятора JIT, ініціалізації VM тощо). Використовуйте перемикач / 3GB для отримання додаткової інформації.


1
Думка про непотрібність файлу сторінки з 4 ГБ або оперативної пам’яті помилкова. Без файлу сторінки операційна система не може вилучати невикористані дані процесу (стек простору для невикористаних служб тощо) з фізичної ОЗУ, тим самим знижуючи обсяг оперативної пам’яті, доступний для реальної роботи. Наявність файлу сторінки звільняє оперативну пам'ять.
ніхто
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.