Разница с Linux VmRSS и общей выделенной памятью Java NativeMemoryTraking (NMT) - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь отслеживать общий объем памяти, выделенный моему приложению Java (OpenJDK 11.0.4) операционной системой (Linux Ubuntu 19.04).

Я делаю два подхода:

  • Использование размера VmRSS из ps или cat /proc/<pid>/status | grep VmRSS
  • Использование функции Java NativeMemoryTracking со следующими свойствами: -XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics и использование общего зафиксированного размера.

Числа, полученные изоба подхода всегда различны (иногда из нескольких мегабайт ... иногда намного больше).

Я понимаю, что размер VmRSS, сообщаемый ОС, является реальной памятью, используемой процессом, но почему JavaNTM сообщает о другом значении?

Если я хочу иметь возможность контролировать размер резидентного набора приложения Java, следует ли мне полагаться на сообщенный размер ОС (VmRSS) или могу ли я использовать что-то внутри JVM (например,НТМ)? В идеале я хочу иметь возможность контролировать размер RSS моего Java-приложения из самого себя ...

1 Ответ

0 голосов
/ 17 октября 2019

Не удивительно, что номера NMT и RSS различаются - JVM и ОС используют разные подходы для измерения разных вещей.

NMT может сообщать намного меньше памяти, чем фактическаяиспользование, или он также может сообщить больше памяти, чем процесс потребляет с точки зрения ОС. Я объяснил причины в этом ответе .

Мониторинг RSS внутри Java-приложения прост. Вы уже знаете о /proc/<pid>/status, так почему бы просто не прочитать /proc/self/status в коде Java? (Linux автоматически сопоставляет self с текущим идентификатором процесса). Еще проще разобрать /proc/self/stat, поскольку вся информация предоставляется в одной строке в заранее заданном формате.

Также возможно получить отчет NMT из приложения Java, как описанов этот ответ .

...