Android內(nèi)存指標(biāo)含義

一、Runtime中的maxMemory、totalMemory、freeMemory

1.maxMemory是指當(dāng)前虛擬機(jī)最大可以使用的內(nèi)存,對于jvm配置的xmx參數(shù)
2.totalMemory指的是當(dāng)前虛擬機(jī)運行時所使用的內(nèi)存,如果在虛擬機(jī)啟動時,配置了xms參數(shù),那么當(dāng)前虛擬機(jī)初始使用的內(nèi)存為配置的數(shù)值,之后會隨著項目運行而增加,最大可以增加至maxMemory
3.freeMemory是指當(dāng)前虛擬機(jī)已經(jīng)申請到但是沒有在使用的內(nèi)存,產(chǎn)生沒有使用的內(nèi)存的情況有兩種:
1>配置了xms參數(shù),比如配置了1G的xms,那邊jvm啟動時,就已經(jīng)申請了1G的內(nèi)存,而程序運行如果只用了0.5G內(nèi)存,那么freeMemory就是1-0.5=0.5G
2>程序運行時,會隨著需要逐步從操作系統(tǒng)申請內(nèi)存,并且申請的量會比需要的量多一些,因此會產(chǎn)生freeMemory,這個數(shù)值一般較小
更多參考:
https://zhuanlan.zhihu.com/p/46365941
https://developer.aliyun.com/article/573189
https://www.oschina.net/question/2293880_2276962

二、ActivityManager的getMemoryClass()及getLargeMemoryClass();以M為單位

兩個方法共同的功能是返回當(dāng)前設(shè)備的每個應(yīng)用程序使用內(nèi)存的近似值。提供一個內(nèi)存限制的界限,方便開發(fā)者可以再規(guī)定的內(nèi)存限制內(nèi)讓應(yīng)用運行的更好。
返回值以兆為單位;基線Android內(nèi)存是16(這恰好是這些設(shè)備的java堆內(nèi)存限制);更有些設(shè)備可能返回24或更高的數(shù)字。
兩者區(qū)別在于:
1.getMemoryClass()是系統(tǒng)為應(yīng)用分配的內(nèi)存,并沒有額外的擴(kuò)充;
2.getLargeMemoryClass()是開發(fā)者通過設(shè)置manifest文件中的<application>標(biāo)簽中l(wèi)argeHeap屬性的值為"true",獲得應(yīng)用可使用的最大內(nèi)存;
但是作為開發(fā)者,建議不要配置manifest獲取最大內(nèi)存,這使得應(yīng)用在擴(kuò)展性方面有很大限制,建議優(yōu)化內(nèi)存已達(dá)到節(jié)省內(nèi)存的目的。

public int getMemoryClass() {
    return staticGetMemoryClass();
}
/** @hide */不對外暴露的方法
static public int staticGetMemoryClass() {
    String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
    if (vmHeapSize != null && !"".equals(vmHeapSize)) {
        return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
    }
    return staticGetLargeMemoryClass();
}
public int getLargeMemoryClass() {
    return staticGetLargeMemoryClass();
}
/** @hide */
static public int staticGetLargeMemoryClass() {
    String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
    return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
}

String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
其中,SystemProperties是系統(tǒng)的屬性,它可以通過get()/set()進(jìn)行對系統(tǒng)的屬性進(jìn)行讀/寫。
從代碼的角度看,兩個方法的核心區(qū)別在于SystemProperties.get()中的參數(shù)
dalvik.vm.heapgrowthlimit:系統(tǒng)對應(yīng)用的內(nèi)存限制的值。
dalvik.vm.heapsize:系統(tǒng)可提供給應(yīng)用的最大內(nèi)存使用值(不顧其他進(jìn)程的死活?)

三、ActivityManager.getMemoryInfo()

ActivityManager.MemoryInfo只有三個Field:
availMem:表示系統(tǒng)剩余內(nèi)存
lowMemory:它是boolean值,表示系統(tǒng)是否處于低內(nèi)存運行
hreshold:它表示當(dāng)系統(tǒng)剩余內(nèi)存低于好多時就看成低內(nèi)存運行

四、Debug的getMemoryInfo(Debug.MemoryInfo memoryInfo)或ActivityManager的MemoryInfo[] getProcessMemoryInfo(int[] pids)。比較詳細(xì).數(shù)據(jù)的單位是KB.

MemoryInfo的Field如下
dalvikPrivateDirty: The private dirty pages used by dalvik。
dalvikPss :The proportional set size for dalvik.
dalvikSharedDirty :The shared dirty pages used by dalvik.
nativePrivateDirty :The private dirty pages used by the native heap.
nativePss :The proportional set size for the native heap.
nativeSharedDirty :The shared dirty pages used by the native heap.
otherPrivateDirty :The private dirty pages used by everything else.
otherPss :The proportional set size for everything else.
otherSharedDirty :The shared dirty pages used by everything else.

Android和Linux一樣有大量內(nèi)存在進(jìn)程之間進(jìn)程共享。某個進(jìn)程準(zhǔn)確的使用好多內(nèi)存實際上是很難統(tǒng)計的。
因為有paging out to disk(換頁),所以如果你把所有映射到進(jìn)程的內(nèi)存相加,它可能大于你的內(nèi)存的實際物理大小。
dalvik:是指dalvik所使用的內(nèi)存。
native:是被native堆使用的內(nèi)存。應(yīng)該指使用C\C++在堆上分配的內(nèi)存。
other:是指除dalvik和native使用的內(nèi)存。但是具體是指什么呢?至少包括在C\C++分配的非堆內(nèi)存,比如分配在棧上的內(nèi)存。puzlle!
private:是指私有的。非共享的。
share:是指共享的內(nèi)存。
PSS:實際使用的物理內(nèi)存(比例分配共享庫占用的內(nèi)存)
Pss:它是把共享內(nèi)存根據(jù)一定比例分?jǐn)偟焦蚕硭母鱾€進(jìn)程來計算所得到進(jìn)程使用內(nèi)存。網(wǎng)上又說是比例分配共享庫占用的內(nèi)存,那么至于這里的共享是否只是庫的共享,還是不清楚。

PrivateDirty:它是指非共享的,又不能換頁出去(can not be paged to disk )的內(nèi)存的大小。比如Linux為了提高分配內(nèi)存速度而緩沖的小對象,即使你的進(jìn)程結(jié)束,該內(nèi)存也不會釋放掉,它只是又重新回到緩沖中而已。
SharedDirty:參照PrivateDirty我認(rèn)為它應(yīng)該是指共享的,又不能換頁出去(can not be paged to disk )的內(nèi)存的大小。比如Linux為了提高分配內(nèi)存速度而緩沖的小對象,即使所有共享它的進(jìn)程結(jié)束,該內(nèi)存也不會釋放掉,它只是又重新回到緩沖中而已。

注意1:MemoryInfo所描述的內(nèi)存使用情況都可以通過命令adb shell "dumpsys meminfo %curProcessName%" 得到。

注意2:如果想在代碼中同時得到多個進(jìn)程的內(nèi)存使用或非本進(jìn)程的內(nèi)存使用情況請使用ActivityManager的MemoryInfo[] getProcessMemoryInfo(int[] pids),

否則Debug的getMemoryInfo(Debug.MemoryInfo memoryInfo)就可以了。

注意3:可以通過ActivityManager的List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses()得到當(dāng)前所有運行的進(jìn)程信息。ActivityManager.RunningAppProcessInfo中就有進(jìn)程的id,名字以及該進(jìn)程包括的所有apk包名列表等。

注意4:數(shù)據(jù)的單位是KB.

五、使用Debug的getNativeHeapSize (),getNativeHeapAllocatedSize (),getNativeHeapFreeSize ()方法。

該方式只能得到Native堆的內(nèi)存大概情況,數(shù)據(jù)單位為字節(jié)B。

static long getNativeHeapAllocatedSize()
返回的是當(dāng)前進(jìn)程navtive堆中已使用的內(nèi)存大小

static long getNativeHeapFreeSize()
返回的是當(dāng)前進(jìn)程navtive堆中已經(jīng)剩余的內(nèi)存大小

static long getNativeHeapSize()
返回的是當(dāng)前進(jìn)程navtive堆本身總的內(nèi)存大小

示例代碼:

Log.i(tag,"NativeHeapSizeTotal:"+(Debug.getNativeHeapSize()>>10)); //>>10轉(zhuǎn)化為KB
Log.i(tag,"NativeAllocatedHeapSize:"+(Debug.getNativeHeapAllocatedSize()>>10));
Log.i(tag,"NativeAllocatedFree:"+(Debug.getNativeHeapFreeSize()>>10));

注意:DEBUG中居然沒有與上面相對應(yīng)的關(guān)于dalvik的函數(shù)。
參考
https://blog.csdn.net/yangdeli888/article/details/43967595

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容