У меня есть небольшой пробел в понимании того, как JVM-процесс распределяет свою собственную память. Насколько я знаю
RSS = Heap size + MetaSpace + OffHeap size
где OffHeap состоит из стеков потоков, прямых буферов, отображенных файлов (библиотек и банок) и самого кода JVM;
В настоящий момент Im пытается проанализировать мое приложение Java (Spring Boot + Infinispan), который RSS 779M (он работает в контейнере докера, поэтому pid 1 в порядке):
[ [email protected]:/data ]$ ps -o rss,vsz,sz 1
RSS VSZ SZ
798324 6242160 1560540
Согласно jvisualvm
, зафиксированный размер кучи 374M
Другими словами, я хочу объяснить 799M - (374M + 89M) = 316M памяти OffHeap.
Мое приложение имеет (в среднем) 36 живых потоков.
Каждый из этих потоков потребляет 1M:
[ [email protected]:/data ]$ java -XX:+PrintFlagsFinal -version |grep ThreadStackSize
intx CompilerThreadStackSize = 0
intx ThreadStackSize = 1024
intx VMThreadStackSize = 1024
Итак, здесь мы можем добавить 36M.
Единственное место, где приложение использует DirectBuffer, это NIO. Насколько я могу видеть из JMX, он не потребляет много ресурсов - только 98K
Последний шаг - это сопоставленные libs и jars. Но согласно pmap
(полный вывод)
[ [email protected]:/data ]$ pmap -x 1 | grep ".so.*" | awk '{ sum+=$3} END {print sum}'
12896K
плюс
[email protected]:/data ]$ pmap -x 1 | grep ".jar" | awk '{ sum+=$3} END {print sum}'
9720K
мы имеем только 20M.
Следовательно, нам еще нужно объяснить 316M - (36M + 20M) = 260M: (
Кто-нибудь знает, что я пропустил?