Android內存的使用

通常,對應Linux的系統來說,可以通過cat /proc/meminfo查看內存的使用情況,Android是基於Linux的,所有也可以使用adb shell cat /proc/meminfo
查看內存的使用情況,如下所示:
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的大小。

發佈了54 篇原創文章 · 獲贊 43 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章