Android为每个应用分配多少内存
Android
出厂后,java虚拟机对单个应用的最大内存分配就确定下来了,超出这个值就会OOM
。这个属性值是定义在/system/build.prop
文件中.
例如,如下参数
bash
dalvik.vm.heapstartsize=8m #起始分配内存
dalvik.vm.heapgrowthlimit=192m #一般情况app申请的最大内存
dalvik.vm.heapsize=512m #设置largeheap时,App可用的最大内存
dalvik.vm.heaptargetutilization=0.75 #GC相关
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m
以上内存数据的理解如下:
- 初始内存大小 :
heapstartsize
虚拟机的内存并不是一次就分配完成的,每次应用打开先分配一个初始值,随着后续需要不断扩大内存 - 单个进程内存限定 :
heapgrowthlimit
表示单个进程内存最大值,超出就会报OOM。(仅仅针对dalvik堆,不包括native堆) - 单个虚拟机或单个进程可用的最大内存 :
heapsize
与上面单个进程内存限定
区别是,当应用配置为大内存时(manifest配置),可以使用的内存会突破单个进程内存限定
,达到最大内存。
配置使用最大内存,在menifest
添加配置即可,如下
xml
<application
...
android:largeHeap="true"
...>
...
</application>
针对不同手机获取app内存信息,可通过adb
命令
bash
$adb shell getprop dalvik.vm.heapstartsize #初始内存大小
$adb shell getprop dalvik.vm.heapgrowthlimit #单个进程内存限定
$adb shell getprop dalvik.vm.heapsize #最大内存
在代码中获取可使用的最大内存
kotlin
private fun appMemInfo() {
val maxMemory = Runtime.getRuntime().maxMemory() //该应用最大占有内存,设置了largeheap该值会变大
val freeMemory = Runtime.getRuntime().freeMemory() //空余的内存,该值会变动例如gc操作
Log.i("memInfo", "--------memTotal=${maxMemory shr 20}, memFree=${freeMemory shr 20}") //shr 20是转换为M,方便查看
}
注意:dalvik内存,不含nativeHeap.
总结:
dalvik
内存,不含nativeHeap
.单个进程能使用的最大内存为heapgrowthlimit
,不同厂商和机型可能不一样。通过在
Menifest
配置largeHeap
可以使用更大的内存, 即heapsize
值。
系统内存
如果要获取手机的总内存,可以使用如下方法
kotlin
private fun sysMemInfo() {
val am = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val memoryInfo = ActivityManager.MemoryInfo()
am.getMemoryInfo(memoryInfo)
val availMem = memoryInfo.availMem //系统可用内存
val totalMem = memoryInfo.totalMem //系统总内存
val threshold = memoryInfo.threshold //低内存阈值,当可用内存小于该值时,系统处于低内存允许
val lowMemory = memoryInfo.lowMemory //系统是否低内存运行
Log.i("memInfo", "--------availMem=${availMem shr 20}, totalMem=${totalMem shr 20}, threshold=${threshold shr 20}, isLowMem=${lowMemory}")
val memoryMax = am.memoryClass //对应于 dalvik.vm.heapgrowthlimit
val largeMemoryClass = am.largeMemoryClass //对应于 dalvik.vm.heapsize
Log.i("memInfo", "--------memMax=${memoryMax}, largeMax=${am.largeMemoryClass}")
}