我对JVM进程如何分配自己的内存还有一些不太明白的地方。就我所知,
RSS = Heap size + MetaSpace + OffHeap size
OffHeap由线程堆栈、直接缓冲区、映射文件(库和JAR文件)以及JVM代码本身组成;
目前我正在分析我的Java应用程序(Spring Boot + Infinispan),其 RSS为779M(它运行在Docker容器中,因此pid 1没问题):
[ root@daf5a5ae9bb7:/data ]$ ps -o rss,vsz,sz 1
RSS VSZ SZ
798324 6242160 1560540
换句话说,我想解释一下 799M - (374M + 89M) = 316M 的 OffHeap 内存。
每个线程消耗 1M:
[ root@fac6d0dfbbb4:/data ]$ java -XX:+PrintFlagsFinal -version |grep ThreadStackSize
intx CompilerThreadStackSize = 0
intx ThreadStackSize = 1024
intx VMThreadStackSize = 1024
所以,我们可以添加36M。
应用程序仅在NIO中使用DirectBuffer。从JMX中我能看到它不会消耗大量资源-只有98K
最后一步是映射的库和jar。但是根据pmap
(完整输出)
[ root@daf5a5ae9bb7:/data ]$ pmap -x 1 | grep ".so.*" | awk '{ sum+=$3} END {print sum}'
12896K
加
root@daf5a5ae9bb7:/data ]$ pmap -x 1 | grep “.jar" | awk '{ sum+=$3} END {print sum}'
9720K
我们这里只有20M。
因此,我们仍然需要解释 316M - (36M + 20M) = 260M :(
有人知道我错过了什么吗?