我有一个巨大的内存消耗Java过程,我正试图弄清楚他正在做什么,所有这些内存。 所以,我正在对这个PID做一个pmap -x,这是一个结果:
Address Kbytes RSS Dirty Mode Mapping 0000000000001000 4 0 0 rw--- [ anon ] 0000000000400000 48 0 0 rx-- java 000000000050b000 4 4 4 rw--- java 0000000003b9d000 264 224 212 rw--- [ anon ] 0000000003bdf000 2199556 1887992 1830160 rw--- [ anon ] 000000396c800000 112 108 0 rx-- 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千字节与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
因此,我想知道这个肮脏的记忆是什么? 我猜这些页面不必写入磁盘,为什么他们被称为脏?
内存或者是私有的,意味着它独占于这个进程,或者是共享的,这意味着多个进程可能已经被映射和使用(想象共享库代码等)。 内存也可以是干净的 – 它从磁盘加载或提供为零填充页面或其他内容,因此它没有被修改,所以如果需要释放内存页面给其他进程,它可以被丢弃,如果需要重新装载/重新装载 – 或者是脏的,这意味着如果需要将其释放,则必须将其写入交换区域,以便在必要时可以恢复修改的内容。
在一个流程中看到大量的私人脏数据并不一定是罕见的。 问题是当系统中所有进程的所有私有脏数据的总和成为整个物理内存的重要部分(确切的数字很大程度上取决于您的工作负载和可接受的性能),而且必须开始交换输入/输出内容。 ..