Як встановити максимальне використання пам'яті для JVM?


132

Я хочу обмежити максимальну пам'ять, яку використовує JVM. Зауважте, це не лише купа, я хочу обмежити загальну пам'ять, що використовується цим процесом.

Відповіді:


94

використовувати аргументи -Xms<memory> -Xmx<memory>. Використовуйте Mчи Gпісля цифр для позначення відповідно Megs та Gigs байтів. -Xmsвказує мінімум та -Xmxмаксимум.


1
ви можете також подивитися MaxPermSize.
urmalp

89
він запитує про пам'ять JVM. Що ви сказали - це розмір купи. Вони обоє різні
всінг

8
Щоб повторно повторити те, що згадуються в інших коментарях, Xms та Xmx налаштовують лише купу. Хоча конфігурація цих змінних має опосередкований вплив на негромовий простір, особа, яка задає питання, намагається встановити, чи є спосіб налаштувати загальне використання пам’яті (heap + non-heap)
murungu

2
уху. тому я встановив, -Xmx524Mі процес займає 1,2 ГБ оперативної пам’яті. (?)
phil294

7
Це не правильна відповідь, параметри -Xms та -Xmx регулюють лише розмір купи jvm, а не загальний розподіл пам'яті.
Пітер Де Вінтер

31

Вам не слід турбуватися про те, що стек просочується (це вкрай рідко). Єдиний раз, коли ви можете змусити стек контролюватись, це нескінченна (або справді глибока) рекурсія.

Це просто купа. Вибачте, спочатку не повністю прочитали ваше запитання.

Вам потрібно запустити JVM із наступним аргументом командного рядка.

-Xmx<ammount of memory>

Приклад:

-Xmx1024m

Це дозволить отримати максимум 1 Гб пам'яті для JVM.


1
Це не так, по цій темі, є кілька способів , ви можете просочуються поза купи stackoverflow.com/questions/1475290 / ...
erotsppa

Ви маєте рацію, існує маса способів виникнення проблем із пам'яттю, що не стосуються стека. Однак вони не дуже поширені.
jjnguy

9
Досить впевнений, що ти не можеш контролювати розмір пам'яті, що не купує, чи не так?
matt b

Напевно, ви можете керувати цим через -XX:MaxDirectMemorySize. Не те, щоб я сильно профілювався, щоб переконатися, але все-таки;)
alexandergunnarson

2
@alexandergunnarson MaxDirectMemorySizeТільки впливає на буфери NIO. Всі види іншої натурної пам'яті використовуються в JVM.
Крістофер Шульц

16

Якщо ви хочете обмежити об'єм пам'яті для jvm (не розмір купи) ulimit -v

Щоб зрозуміти різницю між jvm і накопичувальною пам’яттю, подивіться цю чудову статтю http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- java-process.html


8
Чи ulimitє команда Linux? Я здійснив швидкий пошук у Google, і не побачив жодних стосунків між ulimitта JVM. Y
Сем,


11

Наведена вище відповідь є правильною, ви не можете витончено контролювати, скільки рідної пам'яті виділяє процес Java. Це залежить від того, що робить ваша програма.

Зважаючи на це, залежно від платформи ви можете використовувати якийсь механізм, наприклад, обмежувати розмір Java або будь-який інший процес.

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


1

NativeHeap можна збільшити на -XX: MaxDirectMemorySize = 256M (за замовчуванням - 128)

Я ніколи його не використовував. Можливо, вам це стане в нагоді.


1
Я сумніваюся, що оп хотів цього: рідна пам'ять використовується, коли ви здійснюєте дзвінок на код C / C ++ з Java.
om-nom-nom

6
вбудована пам'ять також використовується при здійсненні nio-дзвінків, якщо ви виділяєте буфери з прямою пам'яттю. (... і завантажувачі, і інформація про тему ....)
stu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.