Android為APP分配多少內(nèi)存?

熟悉Android內(nèi)存分配機(jī)制的朋友都知道百揭,Android為每個(gè)進(jìn)程分配內(nèi)存時(shí),采用彈性的分配方式蜓席,即剛開始并不會(huì)給應(yīng)用分配很多的內(nèi)存器一,而是給每一個(gè)進(jìn)程分配一個(gè)“夠用”的內(nèi)存大小。
那Android到底為每個(gè)應(yīng)用分配多少內(nèi)存呢厨内?我們可以實(shí)際測(cè)試一下:

以本人手上的努比亞NX510J手機(jī)為例:

private void getMaxMemoryInfo(){
    Runtime rt = Runtime.getRuntime();
    long maxMemory = rt.maxMemory();
    Log.e("MaxMemory:", Long.toString(maxMemory/(1024*1024)));
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    Log.e("MemoryClass:", Long.toString(activityManager.getMemoryClass()));
    Log.e("LargeMemoryClass:", Long.toString(activityManager.getLargeMemoryClass()));
}

輸出結(jié)果為:

06-06 15:27:22.740 11917-11917/com.suning.myapp E/MaxMemory:: 192
06-06 15:27:22.740 11917-11917/com.suning.myapp E/MemoryClass:: 192
06-06 15:27:22.740 11917-11917/com.suning.myapp E/LargeMemoryClass:: 512
把AndroidManifest.xml中的application標(biāo)簽加上

<application
...
android:largeHeap="true"
...>
...
</application>
輸出結(jié)果為:

06-06 15:32:06.168 21973-21973/com.suningtang.myapp E/MaxMemory:: 512
06-06 15:32:06.168 21973-21973/com.suningtang.myapp E/MemoryClass:: 192
06-06 15:32:06.168 21973-21973/com.suningtang.myapp E/LargeMemoryClass:: 512
可以看到祈秕,設(shè)置largeHeap為true時(shí), 通過rt.maxMemory();獲取的值為512M雏胃。

因此请毛,對(duì)于本人這臺(tái)手機(jī),系統(tǒng)正常分配的內(nèi)存最多為192M瞭亮;當(dāng)設(shè)置largeHeap時(shí)方仿,最多可申請(qǐng)512M。當(dāng)超過這個(gè)值時(shí)统翩,就會(huì)出現(xiàn)OOM了仙蚜。

這個(gè)值是在哪設(shè)置的呢?查看/system/build.prop文件內(nèi)容:

shell@NX510J:/ $ cat /system/build.prop | grep heap
dalvik.vm.heapsize=36m

dalvik.vm.heapstartsize=8m ----起始分配內(nèi)存
dalvik.vm.heapgrowthlimit=192m ---- 一般情況app申請(qǐng)的最大內(nèi)存 dalvik.vm.heapsize=512m ---- 設(shè)置largeheap時(shí)厂汗,App可用的最大內(nèi)存dalvik.vm.heaptargetutilization=0.75 ---- GC相關(guān)
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m ----- GC機(jī)制相關(guān)
上面的標(biāo)注了各參數(shù)的含義委粉。

那ActivityManager的getMemoryClass()和getLargeMemoryClass()方法返回的的是哪里的值呢?

//ActivityManager.java

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();
}

/**
 * Return the approximate per-application memory class of the current
 * device when an application is running with a large heap.  This is the
 * space available for memory-intensive applications; most applications
 * should not need this amount of memory, and should instead stay with the
 * {@link #getMemoryClass()} limit.  The returned value is in megabytes.
 * This may be the same size as {@link #getMemoryClass()} on memory
 * constrained devices, or it may be significantly larger on devices with
 * a large amount of available RAM.
 *
 * <p>The is the size of the application's Dalvik heap if it has
 * specified <code>android:largeHeap="true"</code> in its manifest.
 */
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));
}

上面的源碼表明娶桦,getMemoryClass()和getLargeMemoryClass()方法最終讀取的仍然是dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize的值贾节。而且匣掸,dalvik.vm.heapsize默認(rèn)值為16M,這也是解釋了google的原生OS默認(rèn)值是16M了氮双。而dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize的值各個(gè)手機(jī)廠家的OS會(huì)對(duì)這個(gè)值進(jìn)行修改碰酝,所以存在差異。

在App中獲取內(nèi)存信息
我們?cè)趹?yīng)用中可以通過ActivityManager的MemoryInfo內(nèi)部類獲取內(nèi)存信息戴差,方法如下:

private void getMemoryInfo() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
manager.getMemoryInfo(info);
Log.e("Memory","系統(tǒng)總內(nèi)存:"+(info.totalMem / (10241024))+"M");
Log.e("Memory","系統(tǒng)剩余內(nèi)存:"+(info.availMem / (1024
1024))+"M");
Log.e("Memory","系統(tǒng)是否處于低內(nèi)存運(yùn)行:"+info.lowMemory );
Log.e("Memory","系統(tǒng)剩余內(nèi)存低于"+( info.threshold / (1024*1024))+"M時(shí)為低內(nèi)存運(yùn)行");
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末送爸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暖释,更是在濱河造成了極大的恐慌袭厂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件球匕,死亡現(xiàn)場(chǎng)離奇詭異纹磺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亮曹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門橄杨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人照卦,你說我怎么就攤上這事式矫。” “怎么了役耕?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵采转,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我瞬痘,道長(zhǎng)故慈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任框全,我火速辦了婚禮察绷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竣况。我一直安慰自己克婶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布丹泉。 她就那樣靜靜地躺著情萤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摹恨。 梳的紋絲不亂的頭發(fā)上筋岛,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音晒哄,去河邊找鬼睁宰。 笑死肪获,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柒傻。 我是一名探鬼主播孝赫,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼红符!你這毒婦竟也來了青柄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤预侯,失蹤者是張志新(化名)和其女友劉穎致开,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萎馅,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡双戳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糜芳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飒货。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耍目,靈堂內(nèi)的尸體忽然破棺而出膏斤,到底是詐尸還是另有隱情徐绑,我是刑警寧澤邪驮,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站傲茄,受9級(jí)特大地震影響毅访,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盘榨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一喻粹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧草巡,春花似錦守呜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至郁竟,卻和暖如春玛迄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棚亩。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工蓖议, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虏杰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓勒虾,卻偏偏與公主長(zhǎng)得像纺阔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子修然,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容