Сколько свободного места нужно оставить между Java Xmx и Docker размером ОЗУ контейнера? - PullRequest
3 голосов
/ 22 февраля 2020

Я на 100% осведомлен о подводных камнях JVM и достижениях / шагах, которые были сделаны в мире JVM, чтобы он мог понять эргономику / ресурсы контейнера. Кроме того, да, я знаю, что Java по умолчанию пытается выделить 1/4 ОЗУ, доступной в среде, в которой он работает ...

Итак, у меня были некоторые мысли и вопросы. Я сделал правило 50/50. Если моему приложению требуется 1 ГБ Xmx, то я создаю контейнер объемом 2 ГБ, который дает еще 1 ГБ ОЗУ для издержек JVM и любых других контейнеров / объектов подкачки (хотя я не уверен, как на самом деле работает своп в контейнере).

Так что я подумал, нужно ли моему приложению 6 ГБ Xmx, действительно ли мне нужно создать контейнер 12 ГБ или я могу сойти с контейнера 7 ГБ или 8 ГБ? Сколько запаса нужно дать внутри контейнера, когда дело доходит до оперативной памяти?

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Это очень сложный вопрос. куча - это только часть процесса Java; также имеет много собственных ресурсов, которые не отслеживаются с -Xms и -Xmx. Здесь очень хорошее резюме о том, что это может быть.

Тогда есть алгоритм сбора мусора, который вы используете: чем больше у него свободы (дополнительного пространства), тем лучше. Это связано с так называемыми G C барьерами . Проще говоря, при выполнении G C все манипуляции с кучей будут «перехватываться» и отслеживаться отдельно. Если скорость выделения высока, пространство, необходимое для отслеживания этих изменений (в то время как происходит активный G C), имеет тенденцию к увеличению. Чем больше у вас места - тем лучше будет работать G C.

Тогда важно, какую версию java вы используете (потому что -Xmx и -Xms могут означать разные вещи под разными java версии относительно контейнеров), например , посмотрите здесь .

Так что здесь нет простого ответа. Если вы можете позволить себе 12GB памяти - сделайте это. Память намного дешевле (обычно), чем отладка любой из вышеперечисленных проблем.

1 голос
/ 22 февраля 2020

Если ваш контейнер предназначен для JVM, вам не нужно использовать процент.

Вам нужно знать, сколько вам нужно java кучи - в данном случае 6 ГБ - и сколько нужно всего остального, что, как вы уже доказали, составляет менее 2 ГБ.

Тогда просто сложите их. Контейнер на 8 ГБ должен подойти в этом случае. Обратите внимание, что стек и куча памяти разделены, поэтому, если вам понадобится большое количество одновременно работающих потоков, не забудьте добавить 1 МБ стекового пространства для каждого (или что-то, что вы установили с помощью -Xss)

ТАКЖЕ, я действительно рекомендую установить минимальный и максимальный размер кучи Java на ТО ЖЕ значение - 6 ГБ в этом случае. Тогда вы гарантированно не удивитесь, если Java попытается увеличить кучу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...