一、背景
博主有一款應用市場應用,同樣的應用,在Android 10上開啟三個下載正常,在Android 14上開啟下載安裝,很頻繁被kill。首先想到的是,是不是應用內存太高,導致被kill,通過工具分析內存也不高,后面就想到是不是系統本身分配給應用的內存就不高,后來通過排查,確實是和系統的內存分配方案有關。
應用被kill?相關日志:
系統kill應用關鍵標識
ActivityManager: Killing
am_kill :
二、解決方法
1、通過排查,Android 14?dalvik.vm.heapgrowthlimit 這個屬性配置的是192m,Android 10配置的是512m,因此,從系統層將該屬性配置為正常的512m
2、在應用?AndroidManifest.xml 中聲明 android:largeHeap="true"
<application android:largeHeap="true"> ... </application>
三、相關概念介紹
dalvik.vm.heapgrowthlimit 是 Android 系統中 Dalvik 虛擬機(DVM)的一個關鍵參數,用于控制應用堆內存的動態增長上限。它的作用如下:
1. 核心作用
限制堆內存的增量擴展:
當應用的堆內存需求超過初始值(dalvik.vm.heapstartsize)時,虛擬機會逐步擴展堆大小,但擴展不會超過 heapgrowthlimit 設定的值。
例如:若 heapgrowthlimit=128m,即使應用需要更多內存,堆大小也不會超過 128MB(除非特殊配置)。
與 dalvik.vm.heapsize 的區別:
heapsize 是堆的絕對最大值(通過 android:largeHeap="true" 可突破 heapgrowthlimit 但不超過 heapsize)。
heapgrowthlimit 是普通應用的默認硬性上限。
2. 為什么需要這個參數?
防止單個應用過度占用內存:
避免因應用內存泄漏或設計缺陷導致系統資源耗盡(OOM),影響其他應用或系統穩定性。
平衡性能與資源:
較小的限制可減少內存壓力,但過低可能導致應用頻繁觸發 GC 或 OOM。
3. 默認值
因設備而異:
不同廠商/ROM 可能設置不同值,通常為 64MB、128MB 或 256MB,取決于設備物理內存大小。
查看方法:
bash
adb shell getprop dalvik.vm.heapgrowthlimit
4. 開發者注意事項
優化內存使用:
若應用接近 heapgrowthlimit,可能觸發 OutOfMemoryError。需通過工具(Android Profiler)分析內存泄漏或優化數據結構。
謹慎使用 largeHeap:
僅在確實需要時(如處理大圖像)在 AndroidManifest.xml 中聲明 android:largeHeap="true",但濫用可能導致系統性能下降。
注:以上只是博主處理的一種方式,還有其他優化方案,例如:控制下載次數等,如果應用確實大量消耗了內存,就要從應用角度減少內存消耗