本篇主要简单记录下,如何获取App的内存使用状态,在这之前我们首先了解下手机系统的内存总量、可用内存、低内存等的获取,代码如下:
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
//手机系统的物理内存总量
val totalMem = memoryInfo.totalMem
//系统可用内寸
val availMem = memoryInfo.availMem
//低内存阈值,当 availMem 低于该值时,系统会开始终止后台服务和其他非无关进程
val threshold= memoryInfo.threshold
//如果系统认为自身当前处于内存不足的情况,则设置为 true
val lowMemory= memoryInfo.lowMemory
以上是系统级的内存状况,即整个设备的内存情况。通常用于 监控系统的整体内存状态,而非单一应用的内存。
应用场景:卡顿优化相关业务处理,比如:在低内存时,禁止播放动画或动效。
App 的内存大致划分,如下图所示:
App 内存占用的获取方式有多种,这里简单介绍 2 种:
- 使用
ActivityManager
获取进程内存信息,是 缓存信息,非实时,获取便捷、轻量val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager // 获取当前应用的内存使用情况 val appMemoryInfo = activityManager.getProcessMemoryInfo(intArrayOf(android.os.Process.myPid()))[0] val dalvikPss = appMemoryInfo.dalvikPss // Java 堆内存 val nativePss = appMemoryInfo.nativePss // Native 堆内存 val otherPss = appMemoryInfo.otherPss // 其他内存 // 应用的内存占用情况(单位:KB) val totalMemory = appMemoryInfo.totalPss // 总的 PSS,包括 Java 堆、Native 堆、代码等
- 使用Debug类进行内存统计, 实时更准确 , 操作有点重,有性能消耗,切忌频繁获取
val memoryInfo = Debug.MemoryInfo() Debug.getMemoryInfo(memoryInfo) val dalvikPss = memoryInfo.dalvikPss // Java 堆内存,单位为 KB val nativePss = memoryInfo.nativePss // Native 堆内存,单位为 KB val otherPss = memoryInfo.otherPss // 其他内存,单位为 KB val usedMemory = memoryInfo.totalPss // 总内存占用,单位为 KB
如果是单纯获取应用在 JVM 的堆内存使用信息,有些方法更轻量,快捷,实时的方法如下:
val runtime = Runtime.getRuntime()
//应用被允许使用的最大的 Java 堆内存,通常与设备限制和分配策略有关。
//对于不同的设备和 API 版本,Android 系统会为每个应用分配不同的最大内存。
val maxMemory = runtime.maxMemory()
//返回现在当前 JVM 分配给应用的总的JAVA堆内存的大小,单位是字节。
val totalMemory = runtime.totalMemory()
//返回现在当前 JVM 分配给应用的可用的空闲内存大小,单位是字节。
val freeMemory = runtime.freeMemory()
//计算出已经使用的JAVA 堆内存
val usedMemory = totalMemory - freeMemory
//举例说明,假设设备上应用的 maxMemory() 为 256 MB。刚启动时,totalMemory() 可能为 64 MB,
//而 freeMemory() 可能为 50 MB。随着应用运行,分配了更多内存,
//totalMemory() 增加到 128 MB,freeMemory() 则减少到 20 MB。
如果是单纯获取应用在 Native 的堆内存使用信息,方法如下:
//返回原生堆的总大小(以字节为单位)。这是系统为原生内存分配的总内存量
val totalHeapSize = Debug.getNativeHeapSize()
//返回当前应用在原生堆上已分配的内存大小(以字节为单位)即:已分配大小
val nativeHeapSize = Debug.getNativeHeapAllocatedSize()
//返回当前应用在原生堆中未分配的内存大小(以字节为单位)即:可用的内存大小。
val freeHeapSize = Debug.getNativeHeapFreeSize()
//三者关系:总大小(totalHeapSize ) = 已分配大小(nativeHeapSize) + 可用大小(freeHeapSize)