MemInfoReader.java revision b3af4ec6bae4fe93d40f021e54cbbce10cc7b4c6
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2011 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package com.android.internal.util;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Debug;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.StrictMode;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public final class MemInfoReader {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    final long[] mInfos = new long[Debug.MEMINFO_COUNT];
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void readMemInfo() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Permit disk reads here, as /proc/meminfo isn't really "on
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // disk" and should be fast.  TODO: make BlockGuard ignore
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // /proc/ and /sys/ files perhaps?
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Debug.getMemInfo(mInfos);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } finally {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            StrictMode.setThreadPolicy(savedPolicy);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Total amount of RAM available to the kernel.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getTotalSize() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_TOTAL] * 1024;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Amount of RAM that is not being used for anything.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getFreeSize() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_FREE] * 1024;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Amount of RAM that the kernel is being used for caches, not counting caches
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * that are mapped in to processes.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getCachedSize() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return getCachedSizeKb() * 1024;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Amount of RAM that is in use by the kernel for actual allocations.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getKernelUsedSize() {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return getKernelUsedSizeKb() * 1024;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Total amount of RAM available to the kernel.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getTotalSizeKb() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_TOTAL];
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Amount of RAM that is not being used for anything.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getFreeSizeKb() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_FREE];
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Amount of RAM that the kernel is being used for caches, not counting caches
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * that are mapped in to processes.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getCachedSizeKb() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_BUFFERS]
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                + mInfos[Debug.MEMINFO_CACHED] - mInfos[Debug.MEMINFO_MAPPED];
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Amount of RAM that is in use by the kernel for actual allocations.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getKernelUsedSizeKb() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_SHMEM] + mInfos[Debug.MEMINFO_SLAB]
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                + mInfos[Debug.MEMINFO_VM_ALLOC_USED] + mInfos[Debug.MEMINFO_PAGE_TABLES]
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                + mInfos[Debug.MEMINFO_KERNEL_STACK];
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getSwapTotalSizeKb() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_SWAP_TOTAL];
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getSwapFreeSizeKb() {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_SWAP_FREE];
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public long getZramTotalSizeKb() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mInfos[Debug.MEMINFO_ZRAM_TOTAL];
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)