JVM 进程如何分配其内存?
在理解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。
该应用程序使用DirectBuffer的唯一地方是NIO。据我从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:(
有谁知道我错过了什么?