今天在寫到獲取手機可用內存空間的總大小的時候,通過下面的方法去獲取的時候,發現該方法最低支持的版本是16,這顯然是不可取的。
1 public static long getTotalSpace(Context ctx) { 2 //1.創建ActivityManager對象 3 ActivityManager am = (ActivityManager) 4 ctx.getSystemService(Context.ACTIVITY_SERVICE); 5 //2 獲取封裝內存信息的對象 6 MemoryInfo memoryInfo = new MemoryInfo(); 7 //3.對對象賦值 8 am.getMemoryInfo(memoryInfo); 9 return memoryInfo.totalMem; 10 }
經查閱資料后,通過讀取proc/meminfo的數據,發現第一行就是我想要的可用內存空間的總大小,通過流的形式讀取了想要的內存空間的總大小
1 try { 2 FileReader fileReader = new FileReader("proc/meminfo"); 3 BufferedReader br = new BufferedReader(fileReader); 4 5 String readLine = br.readLine();// 讀取一行之后剛好是TotalMem的大小 6 7 // 對讀取到的字符串進行ASCII值的匹配,獲取到需要的內存空間的大小 8 char[] charArray = readLine.toCharArray(); 9 10 // 通過StingBuffer將可用空間的 總大小串起來 11 StringBuffer sb = new StringBuffer(); 12 for (char c : charArray) { 13 if (c >= '0' && c <= '9') { 14 sb.append(c); 15 } 16 } 17 //將sb轉換成字符串,同時注意到數據庫文件中的單位是kB,為了統一方便使用,轉換成字節為單位的 18 return Long.parseLong(sb.toString())*1024; 19 20 } catch (Exception e) { 21 e.printStackTrace(); 22 }
然而不禁對proc/meminfo中的其他數據產生了信息,都代表什么意思?
通過adb shell切換到linux環境下,切換到該目錄下,通過cat meminfo得到如下信息
當然你可以在DDMS中找到相應的文件路徑,導出來,用記事本打開查看,基本是一樣的。
針對這些其他數據,查閱資料后,各自的解釋如下:
MemTotal: 所有可用RAM大小(即物理內存減去一些預留位和內核的二進制代碼大小) MemFree: LowFree與HighFree的總和,被系統留着未使用的內存 Buffers: 用來給文件做緩沖大小 Cached: 被高速緩沖存儲器(cache memory)用的內存的大小(等於 diskcache minus SwapCache ). SwapCached:被高速緩沖存儲器(cache memory)用的交換空間的大小,已經被交換出來的內存,但仍然被存放在swapfile 中。用來在需要的時候很快的被替換而不需要再次打開I/O端口。 Active: 在活躍使用中的緩沖或高速緩沖存儲器頁面文件的大小,除非非常必要否則不會被移作他用. Inactive: 在不經常使用中的緩沖或高速緩沖存儲器頁面文件的大小,可能被用於其他途徑. HighTotal: HighFree: 該區域不是直接映射到內核空間。內核必須使用不同的手法使用該段內存。 LowTotal: LowFree: 低位可以達到高位內存一樣的作用,而且它還能夠被內核用來記錄一些自己的數據結構。Among many other things, it is where everything from the Slab is allocated. Bad things happen when you’re out of lowmem. SwapTotal: 交換空間的總大小 SwapFree: 未被使用交換空間的大小 Dirty: 等待被寫回到磁盤的內存大小。 Writeback: 正在被寫回到磁盤的內存大小。 AnonPages:未映射頁的內存大小 Mapped: 設備和文件等映射的大小。 Slab: 內核數據結構緩存的大小,可以減少申請和釋放內存帶來的消耗。 SReclaimable:可收回Slab的大小 SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab) PageTables:管理內存分頁頁面的索引表的大小。 NFS_Unstable:不穩定頁表的大小 VmallocTotal: 可以vmalloc虛擬內存大小 VmallocUsed: 已經被使用的虛擬內存大小。 VmallocChunk: largest contigious block of vmalloc area which is free
個人覺得上述的總結還是比較好的,這里引用下,作為一個擴展。。。