17d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/* 27d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 37d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 47d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 57d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * you may not use this file except in compliance with the License. 67d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * You may obtain a copy of the License at 77d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 87d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 97d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Unless required by applicable law or agreed to in writing, software 117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * See the License for the specific language governing permissions and 147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * limitations under the License. 157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornpackage com.android.internal.util; 187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 198e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackbornimport android.os.Debug; 207d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.os.StrictMode; 217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 22cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackbornpublic final class MemInfoReader { 23cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn final long[] mInfos = new long[Debug.MEMINFO_COUNT]; 247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn public void readMemInfo() { 267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Permit disk reads here, as /proc/meminfo isn't really "on 277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // disk" and should be fast. TODO: make BlockGuard ignore 287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // /proc/ and /sys/ files perhaps? 297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 31cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn Debug.getMemInfo(mInfos); 327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } finally { 337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn StrictMode.setThreadPolicy(savedPolicy); 347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 37b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 38b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Total amount of RAM available to the kernel. 39b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn public long getTotalSize() { 41cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn return mInfos[Debug.MEMINFO_TOTAL] * 1024; 427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 437d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 44b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 45b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Amount of RAM that is not being used for anything. 46b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 477d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn public long getFreeSize() { 48cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn return mInfos[Debug.MEMINFO_FREE] * 1024; 497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 507d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 51b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 52b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Amount of RAM that the kernel is being used for caches, not counting caches 53b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * that are mapped in to processes. 54b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 557d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn public long getCachedSize() { 56b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn return getCachedSizeKb() * 1024; 57cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 58cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 59b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 60b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Amount of RAM that is in use by the kernel for actual allocations. 61b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 62b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn public long getKernelUsedSize() { 63b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn return getKernelUsedSizeKb() * 1024; 64b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn } 65b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn 66b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 67b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Total amount of RAM available to the kernel. 68b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 69cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn public long getTotalSizeKb() { 70cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn return mInfos[Debug.MEMINFO_TOTAL]; 71cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 72cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 73b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 74b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Amount of RAM that is not being used for anything. 75b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 76cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn public long getFreeSizeKb() { 77cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn return mInfos[Debug.MEMINFO_FREE]; 78cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 79cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 80b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 81b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Amount of RAM that the kernel is being used for caches, not counting caches 82b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * that are mapped in to processes. 83b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 84cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn public long getCachedSizeKb() { 855e099800f83651d7b7acc02048e28e45f6986ea3Robert Benea return mInfos[Debug.MEMINFO_BUFFERS] + mInfos[Debug.MEMINFO_SLAB_RECLAIMABLE] 86b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn + mInfos[Debug.MEMINFO_CACHED] - mInfos[Debug.MEMINFO_MAPPED]; 87cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 88cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 89b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn /** 90b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn * Amount of RAM that is in use by the kernel for actual allocations. 91b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn */ 92b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn public long getKernelUsedSizeKb() { 935e099800f83651d7b7acc02048e28e45f6986ea3Robert Benea return mInfos[Debug.MEMINFO_SHMEM] + mInfos[Debug.MEMINFO_SLAB_UNRECLAIMABLE] 94b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn + mInfos[Debug.MEMINFO_VM_ALLOC_USED] + mInfos[Debug.MEMINFO_PAGE_TABLES] 95b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6Dianne Hackborn + mInfos[Debug.MEMINFO_KERNEL_STACK]; 96cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 97cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 98cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn public long getSwapTotalSizeKb() { 99cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn return mInfos[Debug.MEMINFO_SWAP_TOTAL]; 100cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 101cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 102cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn public long getSwapFreeSizeKb() { 103cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn return mInfos[Debug.MEMINFO_SWAP_FREE]; 104cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 105cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 106cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn public long getZramTotalSizeKb() { 107cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn return mInfos[Debug.MEMINFO_ZRAM_TOTAL]; 1087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 1096edb5c665dcb024ae7cfb95b9a92e30dcc5777c1Dianne Hackborn 1106edb5c665dcb024ae7cfb95b9a92e30dcc5777c1Dianne Hackborn public long[] getRawInfo() { 1116edb5c665dcb024ae7cfb95b9a92e30dcc5777c1Dianne Hackborn return mInfos; 1126edb5c665dcb024ae7cfb95b9a92e30dcc5777c1Dianne Hackborn } 1137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn} 114