1. 程式人生 > >獲取Android手機總記憶體和可用記憶體最佳方案

獲取Android手機總記憶體和可用記憶體最佳方案

Android手機的記憶體大小資訊存放在手機系統的/proc/meminfo檔案中,可以通過讀取這個檔案來獲取記憶體資訊。

adb shell檢視

  • 通過adb shell命令,進入終端
adb shell 
  • 執行cat /proc/meminfo,檢視記憶體資訊,命令如下:
cat /proc/meminfo

輸出資訊為:

MemTotal:        5788180 kB
MemFree:          202400 kB
MemAvailable:    1862008 kB
Buffers:          137020 kB
Cached:          1670164 kB
SwapCached: 9972 kB Active: 2311504 kB Inactive: 811540 kB Active(anon): 1050552 kB Inactive(anon): 408972 kB Active(file): 1260952 kB Inactive(file): 402568 kB Unevictable: 122932 kB Mlocked: 118792 kB SwapTotal: 2621436 kB SwapFree: 1916732 kB
Dirty: 116 kB Writeback: 0 kB AnonPages: 1433504 kB Mapped: 728712 kB Shmem: 20948 kB Slab: 375252 kB SReclaimable: 133676 kB SUnreclaim: 241576 kB KernelStack: 73744 kB PageTables: 99356 kB NFS_Unstable: 0 kB
Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 5515524 kB Committed_AS: 165453160 kB VmallocTotal: 263061440 kB VmallocUsed: 0 kB VmallocChunk: 0 kB CmaTotal: 204800 kB CmaFree: 6112 kB

常用項介紹如下:

1)MemTotal: 所有可用RAM大小。(即實體記憶體減去一些預留位和核心的二進位制程式碼大小) 
(2)MemFree: LowFree與HighFree的總和,被系統留著未使用的記憶體。 
(3)Buffers: 用來給檔案做緩衝大小。 
(4)Cached: 被高速緩衝儲存器(cache memory)用的記憶體的大小(等於diskcache minus SwapCache)。 
(5)SwapCached:被高速緩衝儲存器(cache memory)用的交換空間的大小。已經被交換出來的記憶體,仍然被存放在swapfile中,用來在需要的時候很快的被替換而不需要再次開啟I/O埠。 
(6Active: 在活躍使用中的緩衝或高速緩衝儲存器頁面檔案的大小,除非非常必要,否則不會被移作他用。 
(7)Inactive: 在不經常使用中的緩衝或高速緩衝儲存器頁面檔案的大小,可能被用於其他途徑。 
(8)SwapTotal: 交換空間的總大小。 
(9)SwapFree: 未被使用交換空間的大小。 
(10)Dirty: 等待被寫回到磁碟的記憶體大小。 
(11)Writeback: 正在被寫回到磁碟的記憶體大小。 
(12)AnonPages:未對映頁的記憶體大小。 
(13)Mapped: 裝置和檔案等對映的大小。 
(14)Slab: 核心資料結構快取的大小,可以減少申請和釋放記憶體帶來的消耗。 
(15)SReclaimable:可收回Slab的大小。 
(16)SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。 
(17)PageTables:管理記憶體分頁頁面的索引表的大小。 
(18)NFS_Unstable:不穩定頁表的大小。

程式碼獲取

獲取記憶體總大小


public static long getTotalMem() {
    try {
         FileReader fr = new FileReader(FILE_MEMORY);
         BufferedReader br = new BufferedReader(fr);
         String text = br.readLine();
         String[] array = text.split("\\s+");
         Log.w(TAG, text);
         // 單位為KB
         return Long.valueOf(array[1]);
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
     return -1;
 }

獲取可用記憶體大小

public static long getFreeMem(Context context) {
      ActivityManager manager = (ActivityManager) context
               .getSystemService(Activity.ACTIVITY_SERVICE);
       ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
       manager.getMemoryInfo(info);
       // 單位Byte
       return info.availMem;
   }

小結

以上,親測可用,如有問題歡迎留言交流~