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