Android App 内存占用实时获取

        本篇主要简单记录下,如何获取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 堆、代码等
    注意:这里 getProcessMemoryInfo  获取当前应用的内存使用情况拿的是内存快照信息,是有缓存的不实时更新,只有当 内存显著变化 或者 发生系统GC 或者 不同手机系统达到了设置特定的时间时,会生成新的内存快照,否则拿到的是老数据
     
  • 使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值