android APP内存优化

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}")
}

参考资料

Android为每个应用分配多少内存?如何进行性能调优

相关推荐
火柴就是我16 小时前
Flutter 项目本地 Maven 引入 AAR 找不到?一次 Gradle 路径问题排查
android
火柴就是我16 小时前
Android 打包报错 25.0.3
android·前端
码上有光17 小时前
Linux进程通信——共享内存、消息队列和信号量
android·linux·运维·共享内存·通信
Android打工仔21 小时前
Kotlin 协程源码解析:DispatchedContinuation 里的 Dispatcher 从哪里来?
android·kotlin
打工仔折腾 AI21 小时前
从BPE到SentencePiece:Transformer分词原理与Python实战对比
android·人工智能·python·深度学习·langchain·transformer·ai agent 实战
Dovis(誓平步青云)1 天前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
恋猫de小郭1 天前
KMP 又改了编译流程, Separate Compilation 禁止了 `commonMain` 的依赖穿透
android·前端·flutter
执明wa1 天前
Android RecyclerView 实战:点击频道栏切换对应内容
android·开发语言·windows·microsoft·android studio
新鲜势力呀1 天前
PHP 定时数据同步实战:从第三方接口超时到异步同步 + 增量更新架构优化全过程
android
星间都市山脉1 天前
RecoveryUI 圆角屏安全边距配置及代码调用链
android·java·linux·windows·ubuntu