Спасибо @VAS за ваши комментарии.Спасибо за ссылки на kubernetes.
После нескольких тестов я думаю, что не рекомендуется указывать XMX, если вы используете -XX: + UseCGroupMemoryLimitForHeap, поскольку XMX переопределяет его.Я все еще делаю еще несколько тестов и профилирование.
Поскольку мое требование - запуск JVM внутри док-контейнера.Я сделал несколько тестов, как упомянуто в сообщениях @Eugene.Учитывая, что каждому приложению, работающему внутри JVM, потребуются HEAP и некоторая собственная память, я думаю, что нам нужно указать -XX: + UnlockExperimentalVMOptions, XX: + UseCGroupMemoryLimitForHeap, -XX: MaxRAMFraction = 1 (учитывая только JVM, работающую внутри контейнера, вв то же время это рискованно) -XX: MaxRAM (я думаю, что мы должны указать это, если MaxRAMFraction равен 1, так что вы оставляете часть для собственной памяти)
Несколько тестов:
Согласно конфигурации докера ниже,докеру выделяется 1 ГБ, учитывая, что внутри контейнера работает только JVM.Учитывая распределение докера под 1G, и я также хочу выделить часть памяти процесса / собственной памяти, я думаю, что я должен использовать MaxRam = 700M, чтобы у меня было 300 МБ для собственной.
$ docker run -m 1GB openjdk:8u131 java -XX: + UnlockExperimentalVMOptions -XX: + UseCGroupMemoryLimitForHeap -XX: MaxRAMFraction = 1 -XX: MaxRAM = 700M -XshowSettings: vm -version Настройки VM: макс.Размер кучи (расчетный): 622,50M Эргономика Класс компьютера: сервер Использование виртуальной машины: 64-разрядный сервер OpenJDK Виртуальная машина
Теперь указание XX: MaxRAMFraction = 1 может убивать:
ссылки: https://twitter.com/csanchez/status/940228501222936576?lang=en Является ли -XX: MaxRAMFraction = 1 безопасным для производства в загрязненной среде?
Было бы лучше, обратите внимание, что я удалил MaxRAM, поскольку MaxRAMFraction> 1:
$ docker run -m 1GB openjdk: 8u131 java -XX: + UnlockExperimentalVMOptions -XX: + UseCGroupMemoryLimitForHeap -XX: MaxRAMFraction = 2 -XshowSettings: vm -version Параметры виртуальной машины: Макс.Размер кучи (расчетный): 455.50M Эргономика Машинный класс: сервер Использование виртуальной машины: 64-битный сервер OpenJDK ВМ
Это дает оставшиеся 500M для собственного, например, можно использовать для MetaSpace, указав -XX: MaxMetaspaceSize:
$ docker run -m 1ГБ openjdk: 8u131 java -XX: + UnlockExperimentalVMOptions -XX: + UseCGroupMemoryLimitForHeap -XX: MaxRAMFraction = 2 -XX: MaxMetaspaceSize = 200M -XshowSettings: параметры настройки: vm.Размер кучи (расчетный): 455.50M Эргономика Класс компьютера: сервер Использование виртуальной машины: 64-битный сервер OpenJDK VM
Логически, а также в соответствии с приведенными выше ссылками имеет смысл указать -XX: MaxRAMFraction> 1.Это также зависит от выполненного профилирования приложения.
Я все еще делаю еще несколько тестов, обновлю эти результаты или опубликую.Спасибо