Почему Java занимает огромное количество памяти в докер-контейнере

Во-первых, мои подробности настройки.
У меня есть удаленный сервер на базе Linux, на котором я запускаю свое контейнерное приложение-докер, которое имеет Java на jdk 11 и использует Photon OS в качестве базового образа (https://vmware.github.io/photon/assets/files/html/3.0/ Введение.html).
Запросы

  1. Теперь при выполнении сканирования объема памяти с помощью команды 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

  1. Здесь мы видим потребление памяти примерно 99,4%. Итак, мой первый вопрос: что означают эти 99,4% памяти? Насколько я понимаю, вся память использована всеми арендаторами, работающими в нашем контейнере, это сумма потребления памяти всеми приложениями, работающими в контейнере. Я прав ?

  2. Чтобы получить дополнительную информацию, я решил сделать дамп своего Java-приложения. Однако результаты немного озадачивают

  1. Итак, на приведенных выше снимках экрана я вижу, что объем памяти составляет около 70 МБ. Я не могу понять 474,2 МБ - 70 МБ (я понимаю, что 474 МБ - это полный контейнер, но даже внутри контейнерного Java-приложения является процессом, потребляющим больше всего памяти с памятью 470 МБ). Кто занимает столько места? На приведенных выше скриншотах также основной вклад вносят загрузчики системных классов. Я искал свои компоненты в дереве доминаторов, их общий размер даже меньше 10 МБ. Так это ожидаемое поведение в Java.

  2. Я предполагаю, что JDK каким-то образом запускает какой-то процесс в контейнере, как только запускается Java-приложение, которое в конечном итоге занимает так много места. Есть ли как-нибудь анализ этой части. Обратите внимание, что я уже пытался просмотреть файлы системных процедур и там я также вижу несколько случайных адресов с огромным потреблением памяти, но я не смог понять, что они собой представляют и где они находятся, поскольку они не были должным образом аннотированы. Там в сумме тоже было почти 474Мб

  3. С другой стороны, с тем же базовым образом у меня было несколько других файлов приложения сборки golang, которые я запускал (считайте, что это та же бизнес-логика, что и Java-AP), и они попадали в диапазон 20-30 МБ (объем памяти статистики докера ). Так что я очень запутался в этих вещах, кто здесь является жертвой. Все звезды сошлись во мнении, что Java здесь является жертвой, но какая часть Java является жертвой, я не могу понять.

Поэтому любая помощь по вышеизложенному будет очень признательна.

0 ответов

Другие вопросы по тегам