为什么JVM报告的内存比linux进程驻留集大小多?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (143)

我可以看到JVM在不同的类别中使用了多少内存。

我在jdk 1.8.0_45上的应用程序显示:

本机内存跟踪:

总计:保留= 4023326KB,承诺= 2762382KB
-  Java堆(保留= 1331200KB,承诺= 1331200KB)
                            (mmap:reserved = 1331200KB,承诺= 1331200KB) 

- 类(保留= 1108143KB,承诺= 64559KB)
                            (课#8621)
                            (malloc = 6319KB#17371) 
                            (mmap:reserved = 1101824KB,承诺= 58240KB) 

- 线程(保留= 1190668KB,承诺= 1190668KB)
                            (线程#1154)
                            (stack:reserved = 1185284KB,承诺= 1185284KB)
                            (malloc = 3809KB#5771) 
                            (竞技场= 1575KB#2306)

- 代码(保留= 255744KB,承诺= 38384KB)
                            (malloc = 6144KB#8858) 
                            (mmap:reserved = 249600KB,承诺= 32240KB) 

-  GC(保留= 54995KB,承诺= 54995KB)
                            (malloc = 5775KB#217) 
                            (mmap:reserved = 49220KB,承诺= 49220KB) 

- 编译器(保留= 267KB,承诺= 267KB)
                            (malloc = 137KB#333) 
                            (舞台= 131KB#3)

- 内部(保留= 65106KB,承诺= 65106KB)
                            (malloc = 65074KB#29652) 
                            (mmap:保留= 32KB,提交= 32KB) 

- 符号(保留= 13622KB,承诺= 13622KB)
                            (malloc = 12016KB#128199) 
                            (竞技场= 1606KB#1)

- 本机内存跟踪(保留= 3361KB,承诺= 3361KB)
                            (malloc = 287KB#3994) 
                            (跟踪开销= 3075KB)

-  Arena Chunk(保留= 220KB,承诺= 220KB)
                            (malloc的= 220KB) 

运行ps ax -o pid,rss | grep <mypid>top仅显示1.6GB的RES/rss常驻内存。检查交换表示没有使用:

免费-m
             缓存总共使用的空闲共享缓冲区
Mem:129180 99348 29831 0 2689 73024
-  / + buffers / cache:23633 105546
交换:15624 0 15624

为什么JVM表示只有1.6GB驻留时提交2.7GB内存?

提问于
用户回答回答于

你注意下这些概念的细节就行:

使用堆:根据最后一个GC,活动对象占用的内存量

已提交:已使用PROT_NONE以外的地址映射的地址范围。由于懒惰的分配和分页,它们可能会或可能不会被物理或交换支持。

保留:通过mmap特定内存池预先映射的总地址范围。 该预留-致力于差由PROT_NONE映射,这是保证不被物理存储器被备份

居民:目前在物理内存中的页面。这意味着代码,堆栈,已提交内存池的一部分,也包含最近被访问的部分mmaped文件以及JVM控制之外的分配。

虚拟:所有虚拟地址映射的总和。涵盖承诺,保留内存池,但也映射文件或共享内存。这个数字很少提供信息,因为JVM可以预先保留非常大的地址范围或mmap大文件。

扫码关注云+社区

领取腾讯云代金券