Почему Java занимает огромное количество памяти в докер-контейнере
Во-первых, мои подробности настройки.
У меня есть удаленный сервер на базе Linux, на котором я запускаю свое контейнерное приложение-докер, которое имеет Java на jdk 11 и использует Photon OS в качестве базового образа (https://vmware.github.io/photon/assets/files/html/3.0/ Введение.html).
Запросы
- Теперь при выполнении сканирования объема памяти с помощью команды Docker Stats я вижу следующие значения:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5f683918eab7 some-random-agent 0.31% 474.2MiB / 476.8MiB 99.44% 71.3MB / 2.51MB 45.4MB / 197kB 58
Здесь мы видим потребление памяти примерно 99,4%. Итак, мой первый вопрос: что означают эти 99,4% памяти? Насколько я понимаю, вся память использована всеми арендаторами, работающими в нашем контейнере, это сумма потребления памяти всеми приложениями, работающими в контейнере. Я прав ?
Чтобы получить дополнительную информацию, я решил сделать дамп своего Java-приложения. Однако результаты немного озадачивают
Итак, на приведенных выше снимках экрана я вижу, что объем памяти составляет около 70 МБ. Я не могу понять 474,2 МБ - 70 МБ (я понимаю, что 474 МБ - это полный контейнер, но даже внутри контейнерного Java-приложения является процессом, потребляющим больше всего памяти с памятью 470 МБ). Кто занимает столько места? На приведенных выше скриншотах также основной вклад вносят загрузчики системных классов. Я искал свои компоненты в дереве доминаторов, их общий размер даже меньше 10 МБ. Так это ожидаемое поведение в Java.
Я предполагаю, что JDK каким-то образом запускает какой-то процесс в контейнере, как только запускается Java-приложение, которое в конечном итоге занимает так много места. Есть ли как-нибудь анализ этой части. Обратите внимание, что я уже пытался просмотреть файлы системных процедур и там я также вижу несколько случайных адресов с огромным потреблением памяти, но я не смог понять, что они собой представляют и где они находятся, поскольку они не были должным образом аннотированы. Там в сумме тоже было почти 474Мб
С другой стороны, с тем же базовым образом у меня было несколько других файлов приложения сборки golang, которые я запускал (считайте, что это та же бизнес-логика, что и Java-AP), и они попадали в диапазон 20-30 МБ (объем памяти статистики докера ). Так что я очень запутался в этих вещах, кто здесь является жертвой. Все звезды сошлись во мнении, что Java здесь является жертвой, но какая часть Java является жертвой, я не могу понять.
Поэтому любая помощь по вышеизложенному будет очень признательна.