几行代码轻松监控Android GC 情况

为什么要监控gc情况

不仅仅是android了,其实只要是java技术这一块的,做性能监控,gc次数/频率 肯定是要做的,服务端那边也有,只不过他们监控的手段和我们不太一样。

但是目的是一样的,gc的频率是影响app流畅性的一个重要指标

android的监控方案

对于低版本的android手机来说,只要发生了gc,log日志是会有相应的日志的。但是高版本这个日志就没了,那么我们如何感知到 android的虚拟机发生了gc呢?

其实android源码里已经有现成的例子了 BinderInternal

其实关键就是一直保留一个弱引用对象,当这个弱引用的对象被回收时,则一定会走到finalize 这个方法内,此时则意味着发生了gc行为

还不算完,你要保证你能一直监控整个app期间的gc行为,那你在finalize这个方法内 要确保 再重新new出来这个弱引用对象,否则 gc一次 你这个对象没了 后面就再也收不到gc了

kotlin的极简实现

kotlin 复制代码
object GcWatcher {
    private var gcWatcher: WeakReference<GcWatcherInternal>? = null
    // 在你application启动的时候 init就行
    @JvmStatic
    fun init() {
        if (gcWatcher == null) {
            gcWatcher = WeakReference(GcWatcherInternal())
        } else {
            Log.v(TAG, "GCWatcher() is inited,dont need init again")
        }
    }

    class GcWatcherInternal {
        @kotlin.jvm.Throws(Throwable::class)
        protected fun finalize() {
            // 每次gc都会走这里 可以在这里统计你想要的次数/频率等信息
            Log.v(TAG, "GcWatcherInternal detect vm do gc !!!!!")
            gcWatcher = WeakReference(GcWatcherInternal())

        }
    }
}

最后你们app冷启动到首屏渲染之间,发生了几次gc呢? 你认为发生多少次gc 是比较理想的情况?

相关推荐
三少爷的鞋1 小时前
Repository 方法设计:suspend 与 Flow 的决选择指南(以朋友圈为例)
android
阿里云云原生2 小时前
Android App 崩溃排查指南:阿里云 RUM 如何让你快速从告警到定位根因?
android·java
cmdch20174 小时前
手持机安卓新增推送按钮功能
android
攻城狮20154 小时前
【rk3528/rk3518 android14 kernel-6.10 emcp sdk】
android
何妨呀~4 小时前
mysql 8服务器实验
android·mysql·adb
QuantumLeap丶5 小时前
《Flutter全栈开发实战指南:从零到高级》- 25 -性能优化
android·flutter·ios
木易 士心7 小时前
MVC、MVP 与 MVVM:Android 架构演进之路
android·架构·mvc
百锦再7 小时前
国产数据库的平替亮点——关系型数据库架构适配
android·java·前端·数据库·sql·算法·数据库架构
走在路上的菜鸟7 小时前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
介一安全7 小时前
【Frida Android】实战篇15:Frida检测与绕过——基于/proc/self/maps的攻防实战
android·网络安全·逆向·安全性测试·frida