我有一个巨大的RAM消耗Java进程,我正在试图弄清楚他正在做什么这些内存。所以,我正在对这个PID做一个pmap -x,这是一个结果:
Address Kbytes RSS Dirty Mode Mapping
0000000000001000 4 0 0 rw--- [ anon ]
0000000000400000 48 0 0 r-x-- java
000000000050b000 4 4 4 rw--- java
0000000003b9d000 264 224 212 rw--- [ anon ]
0000000003bdf000 2199556 1887992 1830160 rw--- [ anon ]
000000396c800000 112 108 0 r-x-- ld-2.5.so
000000396ca1c000 4 4 4 r---- ld-2.5.so
[...]
ffffffffff600000 8192 0 0 ----- [ anon ]
---------------- ------ ------ ------
total kB 7072968 4382820 4270104
正如您在地址3BDF000上看到的那样,有一个2199556 KBytes和1830160 Dirty的映射。
在/ proc / 10139 / smaps中,可以看到更详细的信息:
03bdf000-89fe0000 rw-p 03bdf000 00:00 0
Size: 2199556 kB
Rss: 1887996 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 57832 kB
Private_Dirty: 1830164 kB
Swap: 231996 kB
Pss: 1887996 kB
因此,我想知道这个脏记忆是什么?我想这些页面不必写入磁盘,为什么它们被称为脏?
答案 0 :(得分:10)
内存是私有的,这意味着它是独占的,或者是共享的,这意味着多个进程可能会映射和使用它(想想共享库代码等)。内存也可以是干净的 - 它没有被修改,因为它是从磁盘加载或提供为零填充页面或其他任何东西,所以如果它需要被释放为其他进程提供内存页面,它可以被丢弃,如果再次需要它,则重新加载/重新填充 - 或者脏,这意味着如果需要释放,则必须将其写入交换区域,以便在必要时可以恢复修改后的内容。
在流程中看到大量私有脏数据并不一定是不寻常的。问题是,当系统中所有进程的所有私有脏数据的总和成为整个物理内存的重要部分(确切数字在很大程度上取决于您的工作负载和可接受的性能)时,必须开始交换内容。 ..