6

我有一个消耗大量 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 KB 与 1830160 脏的映射。

在 /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

因此,我想知道这个脏内存是什么?我猜这些页面不必写入磁盘,那么为什么它们被称为脏页呢?

4

1 回答 1

11

内存要么是私有的,这意味着它是该进程独有的,要么是共享的,这意味着多个进程可以映射并使用它(想想共享库代码等)。内存也可以是干净的——它没有被修改过,因为它是从磁盘加载的或者作为零填充页面提供的,所以如果需要释放它来为其他进程提供内存页面,它可以被丢弃,如果再次需要它或脏,则重新加载/重新填充,这意味着如果需要释放它,则必须将其写出到交换区域,以便在必要时可以恢复修改的内容。

在一个进程中看到大量私有脏数据并不一定不寻常。问题是当系统中所有进程的所有私有脏数据的总和成为整个物理内存的重要部分(确切数字很大程度上取决于您的工作量和可接受的性能)时,必须开始换入/换出。 ..

于 2013-07-11T15:02:43.700 回答