Настройка -XX: MaxRam - PullRequest
       84

Настройка -XX: MaxRam

0 голосов
/ 25 сентября 2018

В соответствии с этой ссылкой есть возможность установить MaxRamSize вручную, чтобы ограничить JVM, чтобы он не использовал память за пределами этого.Но я не видел никакой документации того же самого.Я никогда не знал этого.Есть ли что-то подобное или что-то подобное?PS.Я знаю, и я не собираюсь устанавливать размеры кучи / стека / мета пространства / нативной памяти.Я просто хотел бы знать, если есть общий вариант ограничения памяти.

Попытка этого не помогла, поскольку произошла ошибка:

Improperly specified VM option 'MaxRAM=1073741824B'
Could not create the Java Virtual Machine.
A fatal exception has occurred. Program will exit.

Infact согласно этой ссылке open-jdk, кажется, имеет эти опции.Еще одна ссылка , которую я нашел, я считаю, указывает на то, чтобы установить размер кучи.Который опять не ищет.Но это для Oracle, я думаю.

Почему я ищу такую ​​опцию для запуска приложения внутри контейнера (например, Docker) и предотвращения уничтожения приложения OOM Killer.Я верю в то, что если настройка такого java-приложения приведет к ошибке или аварийному завершению с java.lang.OutOfMemoryError, а не к завершению контейнера.

Мои предположения и понимания могут быть полностью неверными.Этот вопрос также может быть совершенно неправильным и неуместным.Но, конечно, спросить путь вперед :).

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Я думаю java жалуется на "Б".Согласно вводу вручную, команда java понимает суффиксы k / K или m / M или g / G для размеров.В нем не упоминается «B».

(Вы заметили, что в сообщении об ошибке указано «неправильно указано», а не «неизвестно»? Это указывает на то, что команда java распознала параметр, но синтаксисневерно. См. выше ...)

Глядя на исходный код OpenJDK для Java 11, я вижу параметр MaxRAM, определенный в файле "gc_globals.hpp".

0 голосов
/ 25 сентября 2018

Почему я ищу такой вариант запуска приложения внутри контейнера (например, Docker) и предотвращения уничтожения приложения OOM Killer.

Этоэто именно тот вариант, который вы ищете.Более того, он был должным образом интегрирован с cgroups (~ docker) как часть JDK-8170888 .Обратите внимание, что этот флаг не запрещает JVM выделять больше памяти, чем его значение, но скорее дает подсказку: «Я знаю, что мой предел физической памяти равен X, пожалуйста, выделите в X», поэтому JVM поделится этим значением между кучей Java и собственной памятью.Но если, например, ваше приложение имеет утечку памяти или загрузчик классов, этот предел все равно будет достигнут.

JVM жалуется на MaxRAM=1073741824B, потому что она не ожидает B в конце, она должна быть объявлена ​​как -XX:MaxRAM=1073741824.См. описание флага: Real memory size (in bytes) used to set maximum heap size.

0 голосов
/ 25 сентября 2018

Я нашел ссылку

https://chriswhocodes.com/hotspot_options_jdk11.html?s=MaxRam

Но, как предполагает Стивен С, это, вероятно, просто B

ПРИМЕЧАНИЕ. Это максимальный используемый объем ОЗУрассчитать кучи по умолчанию и максимум памяти Direct.Это не обеспечивает большего применения.

Реальный объем памяти (в байтах), используемый для установки максимального размера кучи

и для другого параметра

Максимально эргономически установленный размер кучи (в байтах);[по умолчанию] ноль означает использование MaxRAM * MaxRAMPercentage / 100


В Oracle / OpenJDK нет очевидной опции.

$ java -version -XX:+PrintFlagsFinal | grep -i MaxRAM

Однако в Linux вы можетеустановите максимальный объем памяти с помощью ulimit, однако это приведет к аварийному завершению работы JVM при достижении.

...