I have a huge RAM-consuming Java process and I'm trying to figure what he's doing with all this memory. So, I'm doing a pmap -x on this PID and here is a piece of the result :
我有一个巨大的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
As you can see on address 3BDF000 there is a mapping of 2199556 KBytes with 1830160 of Dirty.
正如您在地址3BDF000上看到的那样,有一个2199556 KBytes和1830160 Dirty的映射。
In /proc/10139/smaps, on can see it with more details :
在/ 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
Hence, I'd like to know what this dirty memory is? I guess these pages don't have to be written to disk, so why are they called dirty?
因此,我想知道这个脏记忆是什么?我想这些页面不必写入磁盘,为什么它们被称为脏?
1 个解决方案
#1
9
Memory is either private, meaning it is exclusive to this process, or shared, meaning multiple processes may have it mapped and in use (think shared library code, etc.). Memory can also be clean - it hasn't been modified since it was loaded from disk or provided as zero-filled pages or whatever, and so if it needs to be freed to provide memory pages for other processes, it can just be discarded, and reloaded/re-filled if it is ever needed again - or dirty, which means if it needs to be freed up, it must be written out to a swap area so that the modified contents can be recovered when necessary.
内存是私有的,这意味着它是独占的,或者是共享的,这意味着多个进程可以映射和使用它(想想共享库代码等)。内存也可以是干净的 - 它没有被修改,因为它是从磁盘加载或提供为零填充页面或其他任何东西,所以如果它需要被释放为其他进程提供内存页面,它可以被丢弃,如果再次需要,则重新加载/重新填充 - 或者脏,这意味着如果需要将其释放,则必须将其写入交换区域,以便在必要时可以恢复修改后的内容。
It's not necessarily unusual to see large amounts of private dirty data in a process. The problem is when the sum of all private dirty data across all processes in the system becomes a significant portion (exact numbers depend greatly on your workload and acceptable performance) of your overall physical memory, and stuff has to start being swapped in/out...
在进程中看到大量私有脏数据并不一定是不寻常的。问题是,当系统中所有进程的所有私有脏数据的总和成为整个物理内存的重要部分(确切数字在很大程度上取决于您的工作负载和可接受的性能)时,必须开始交换内容。 ..
#1
9
Memory is either private, meaning it is exclusive to this process, or shared, meaning multiple processes may have it mapped and in use (think shared library code, etc.). Memory can also be clean - it hasn't been modified since it was loaded from disk or provided as zero-filled pages or whatever, and so if it needs to be freed to provide memory pages for other processes, it can just be discarded, and reloaded/re-filled if it is ever needed again - or dirty, which means if it needs to be freed up, it must be written out to a swap area so that the modified contents can be recovered when necessary.
内存是私有的,这意味着它是独占的,或者是共享的,这意味着多个进程可以映射和使用它(想想共享库代码等)。内存也可以是干净的 - 它没有被修改,因为它是从磁盘加载或提供为零填充页面或其他任何东西,所以如果它需要被释放为其他进程提供内存页面,它可以被丢弃,如果再次需要,则重新加载/重新填充 - 或者脏,这意味着如果需要将其释放,则必须将其写入交换区域,以便在必要时可以恢复修改后的内容。
It's not necessarily unusual to see large amounts of private dirty data in a process. The problem is when the sum of all private dirty data across all processes in the system becomes a significant portion (exact numbers depend greatly on your workload and acceptable performance) of your overall physical memory, and stuff has to start being swapped in/out...
在进程中看到大量私有脏数据并不一定是不寻常的。问题是,当系统中所有进程的所有私有脏数据的总和成为整个物理内存的重要部分(确切数字在很大程度上取决于您的工作负载和可接受的性能)时,必须开始交换内容。 ..