2013-07-11 71 views
4

我有一個巨大的內存消耗Java過程,我試圖弄清楚他在用這些內存做什麼。所以,我在做這個PID一PMAP -x,這裏是一片結果:smaps中「Private_Dirty」記憶的含義是什麼?

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千字節用骯髒的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 

因此,我想知道這個骯髒的記憶是什麼?我猜這些頁面不必寫入磁盤,爲什麼他們被稱爲髒?

回答

8

內存可以是私有的,這意味着它是該進程的專有或共享的,這意味着多個進程可能已被映射和使用(認爲共享庫代碼等)。內存也可以是乾淨的 - 從磁盤加載或提供爲零填充頁面或其他內容以來,它並沒有被修改,因此如果需要釋放內存頁面以供其他進程使用,則可以將其丟棄,如果需要重新加載/重新填充 - 或者是髒的,這意味着如果需要釋放它,則必須將其寫入交換區域,以便在必要時可以恢復修改的內容。

在進程中看到大量私有髒數據並不一定非常罕見。問題是,系統中所有進程中所有私有髒數據的總和成爲整個物理內存的重要部分(確切數字取決於您的工作負載和可接受的性能),並且必須開始交換輸入/輸出內容。 ..