Сценарий:
У меня есть JVM, работающая в контейнере докера. Я провел некоторый анализ памяти, используя два инструмента: 1) top 2) Отслеживание собственной памяти Java. Числа выглядят сбивающими с толку, и я пытаюсь найти то, что вызывает различия.
Вопрос:
RSS сообщается как 1272 МБ для процесса Java, а общий объем памяти Java - 790,55 МБ. Как я могу объяснить, куда ушла оставшаяся память 1272 - 790,55 = 481,44 МБ?
Почему я хочу оставить этот вопрос открытым даже после просмотра этого вопроса на SO:
Я видел ответ, и объяснение имеет смысл. Однако после получения выходных данных Java NMT и pmap -x я все еще не могу конкретно отобразить, какие адреса Java-памяти фактически являются резидентными и физически сопоставлены. Мне нужно какое-то конкретное объяснение (с подробными шагами), чтобы найти причины этого различия между RSS и Java.
Верхний вывод
Java NMT
Статистика памяти Docker
диаграммы
У меня есть докер-контейнер, работающий более 48 часов. Теперь, когда я вижу график, который содержит:
- Общий объем памяти, выделенный для док-контейнера = 2 ГБ
- Java Max Heap = 1 ГБ
- Всего зафиксировано (JVM) = всегда менее 800 МБ
- Используемая куча (JVM) = всегда менее 200 МБ
- Не используется куча (JVM) = всегда меньше, чем 100 МБ.
- RSS = около 1,1 ГБ.
Итак, что же потребляет память между 1,1 ГБ (RSS) и 800 МБ (общая выделенная память Java)?