Garbage Collection in Android

视频观看笔记,如需转载,请注明出处


前言

Java 语言之所以如此受欢迎,得益于它的内存自动管理机制。但 GC 中的 "Stop the World Event",对 APP 性能来说,也是一个挑战。

Colt McAnlis 通过本视频介绍了 Android 平台的垃圾回收机制,以及如何进行性能优化。

视频链接

历史

Garbage Collection 是由 John McCarthy 于1959 年提出的概念,用于解决 LISP 语言中的问题。它主要涉及两个原则:1. 找出不再访问的对象 2. 回收这些对象占用的资源。

2722938-e047cbb56b0f97e6.png
John McCarthy

难题

想象一下,你分配了 20,000 个对象,那么怎么识别哪些对象是不再访问的,或者什么时候应该触发 GC 事件呢?

2722938-ef6685d21f2d25d1.png

这真是一个难题。自 GC 概念提出之后的 50 年里,我们一直致力于提升垃圾收集器的性能。这也是为什么 Android 的垃圾回收器比 John McCarthy 提出的复杂的多的原因。

解决办法

事实上,Android 系统根据所分配对象的类型以及 GC 时系统如何管理这些对象,将进程所使用的内存分成了多个空间。新分配的对象位于什么空间,取决于你的 Android Runtime 是什么版本,5.0 以上是 ART(Android Runtime)虚拟机,5.0以下是 Dalvik 虚拟机。

2722938-baf23694ef4e3d76.png

每个空间都有大小限制,系统会跟踪整个程序所占用的内存大小。当程序占用内存达到一定程度时,系统就会触发 GC 回收内存,以便将来分配给其它对象:

2722938-68ba1cf988280dc1.png

GC 事件在 Dalvik 虚拟机和 ART 虚拟机上的表现也不尽相同。在 Dalvik 虚拟机中,很多 GC 事件都是 "Stop the World Event":

2722938-118545d307e9a808.png

而 ART 虚拟机扩展了并发 GC 算法,消除了大的 GC 停顿时间,但是在重要步骤上,还是会有短暂的停顿:

2722938-77ce8e9423b095c7.png

APP 性能问题

尽管系统工程师做了大量优化来提升 GC 速度来减少卡顿,但是你的 App 仍然可能存在性能问题。我们知道,Android 系统每 16 ms 就要渲染一帧,所以在一帧时间内,GC 时间越长,留给业务逻辑的时间就越短:

2722938-cfedee9abdabb8d0.png

如果你的 GC 过于频繁(比如在循环中创建了大量临时对象)或 GC 时间过长,就会导致 1 帧的处理时间超过 16 ms 上限,这就会给用户造成卡顿、掉帧的视觉效果:

2722938-ffd78779ac5ab993.png

分析工具

好在,Android Studio 的 Profiler 工具,可以用来查看内存使用情况以及内存分配情况。

结语

不过,内存优化就是说起来简单,做起来难,所以你还需要观看以下视频来掌握更多的性能优化知识:

2722938-23f0aa50b8b2a401.png

链接

笔者总结

从 Colt McAnlis 的视频来看,Android 的 Dalvik 或者 ART 虚拟机的 Runtime Data Areas、GC Algorithm 应该与 HotSpot 虚拟机差异不大,所以 GC 细节可以参考上一篇文章来理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值