查看內存的使用情況,如下所示:
MemTotal: 1893284 kB
MemFree: 823932 kB
Buffers: 30628 kB
Cached: 389332 kB
SwapCached: 0 kB
Active: 524500 kB
Inactive: 243048 kB
Active(anon): 347616 kB
Inactive(anon): 400 kB
Active(file): 176884 kB
Inactive(file): 242648 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 1149952 kB
HighFree: 259828 kB
LowTotal: 743332 kB
LowFree: 564104 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 347560 kB
Mapped: 96004 kB
Shmem: 452 kB
Slab: 45988 kB
SReclaimable: 22544 kB
SUnreclaim: 23444 kB
KernelStack: 6608 kB
PageTables: 8944 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 946640 kB
Committed_AS: 7674556 kB
VmallocTotal: 245760 kB
VmallocUsed: 74616 kB
VmallocChunk: 75616 kB
其中:
MemTotal: 總的可用內存
MemFree: 未被分配空閒的內存
Buffers: buffer的大小
Cached: cache的大小
SwapCached: swap 緩存的大小,Android很少使用swap的,經常爲0
其中free memory = MemFree + Buffer + Cached,那麼used memory = MemTotal - free memory = MemTotal - MemFree - Buffer - Cached,爲649M
按理說應該是這樣的,但事實卻未必如此,使用procrank命令,看以看到總的信息如下:
PSS RSS
TOTAL 469252K 390792K
RAM: 1893284K total, 817792K free, 30692K buffers, 390192K cached, 452K shmem, 45976K slab
可用看到PSS的內存大小爲469M,還有80M不知道跑哪去了。哦,完了還有PageTables佔用的內存沒有減去,而此時系統PageTables才8M,649 - 9 = 640M,
離469M的PSS還有71M,應該還有地方沒有去除的。是的,shmem和slab沒有去除,這兩個加起來有46M,71 - 46 = 25M,那這25M去哪了呢?應該是Android
Reserved 或者是3D/HW buffer使用了吧!不太清楚。
其實,應該通過zoneinfo裏面去查看內存的使用情況(單位:4kb,一個page的大小),可能更準確:
Node 0, zone Normal
pages free 140745
min 877
low 1096
high 1315
scanned 0
spanned 228352
present 192553
nr_free_pages 140745
nr_inactive_anon 0
nr_active_anon 0
nr_inactive_file 4187
nr_active_file 3590
nr_unevictable 0
nr_mlock 0
nr_anon_pages 0
nr_mapped 39
nr_file_pages 7771
nr_dirty 0
nr_writeback 0
nr_slab_reclaimable 5636
nr_slab_unreclaimable 5840
nr_page_table_pages 2479
nr_kernel_stack 867
nr_unstable 0
nr_bounce 0
nr_vmscan_write 0
nr_vmscan_immediate_reclaim 0
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 0
nr_dirtied 32731
nr_written 32731
nr_anon_transparent_hugepages 0
nr_free_cma 2329
protection: (0, 8902, 8902)
pagesets
cpu: 0
count: 52
high: 186
batch: 31
vm stats threshold: 8
all_unreclaimable: 0
start_pfn: 0
inactive_ratio: 1
Node 0, zone HighMem
pages free 58767
min 128
low 452
high 776
scanned 0
spanned 295936
present 284887
nr_free_pages 58767
nr_inactive_anon 101
nr_active_anon 90565
nr_inactive_file 57093
nr_active_file 41004
nr_unevictable 0
nr_mlock 0
nr_anon_pages 90557
nr_mapped 24040
nr_file_pages 98210
nr_dirty 0
nr_writeback 0
nr_slab_reclaimable 0
nr_slab_unreclaimable 0
nr_page_table_pages 0
nr_kernel_stack 0
nr_unstable 0
nr_bounce 0
nr_vmscan_write 0
nr_vmscan_immediate_reclaim 0
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 113
nr_dirtied 36767
nr_written 36179
nr_anon_transparent_hugepages 0
nr_free_cma 18652
protection: (0, 0, 0)
pagesets
cpu: 0
count: 14
high: 186
batch: 31
vm stats threshold: 10
all_unreclaimable: 0
start_pfn: 228352
inactive_ratio: 3
可以看到只有一個node,但有兩個zone:Normal和HighMem,Android一般不使用DMA,所以只有兩個zone。
User space usage = nr_inactive_anon + nr_active_anon + nr_inactive_file + nr_active_file + nr_unevictable
Kernel usage = present - nr_free_pages - User space usage
分別計算出兩個zone的 User space usage 和Kernel usage,然後再通過
Reserved + 3D/HW buffer = Total memory - Kernel usage - User space usage
得到Reserved + 3D/HW buffer的大小。