为什么要监控gc情况
不仅仅是android了,其实只要是java技术这一块的,做性能监控,gc次数/频率 肯定是要做的,服务端那边也有,只不过他们监控的手段和我们不太一样。
但是目的是一样的,gc的频率是影响app流畅性的一个重要指标
android的监控方案
对于低版本的android手机来说,只要发生了gc,log日志是会有相应的日志的。但是高版本这个日志就没了,那么我们如何感知到 android的虚拟机发生了gc呢?
其实android源码里已经有现成的例子了 BinderInternal
其实关键就是一直保留一个弱引用对象,当这个弱引用的对象被回收时,则一定会走到finalize 这个方法内,此时则意味着发生了gc行为
还不算完,你要保证你能一直监控整个app期间的gc行为,那你在finalize这个方法内 要确保 再重新new出来这个弱引用对象,否则 gc一次 你这个对象没了 后面就再也收不到gc了
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 是比较理想的情况?
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题