跳转至

Android 性能优化技术月报 | 2025 年 2 月

每个月都会有一些 Android 性能优化相关的优质内容发布,然而,碎片化阅读使得这些知识难以形成完整体系,且容易被遗忘。为解决这些问题,我决定尝试使用技术月报的形式,总结我在最近一个月内查阅的 Android 性能优化相关的优质内容。

月报的主要内容包括:整理展示我在最近一个月所查阅的 Android 性能优化领域的最新技术动态、精选博客,精选视频等内容。

最新动态

《Android性能优化之道》发布

这是一套从Android性能优化本质入手,指导读者实现从硬件层到操作系统层再到应用层全面优化的实战方法论。本书由Android方向Google开发者专家撰写,融合了作者10年大厂实战经验,其中不仅包括作者实操过的监控、优化、防劣化等方向的各种典型案例,还包括多个实战小技巧,可以帮助读者解决工作中遇到的90%以上的能优化问题。

本书内存、速度和流畅性、稳定性、包体积、耗电、磁盘占用、流量、降级这8个方向的性能优化内容。这些内容方向均从原理和实战两个维度进行解读。其中,原理部分直指优化的本质,不仅包括相关基础知识,还包括性能优化的底层逻辑;实战部分以指导读者实操为主要目标,以案例为主要讲解形式,深度解读作者精心总结的各种实战案例中用到的技术和原理。

本书基于 Android 14 撰写,但也会涉及 Android 14 以外的其他 Android 版本的源码。

精选博客

快手Java透明协程:实现零代码修改提升30%QPS

本文主要介绍了快手基于社区开源版本自研的 Java17 透明协程技术,实现了零代码修改提升 30% QPS 的效果。

  • 协程技术发展与挑战:协程思想可追溯至 1963 年,虽未成为并发编程主流,但随着互联网业务发展重新受青睐。Java 协程起步晚,Oracle 官方的 Loom 协程方案备受瞩目。传统并发编程模型有线程和异步两种,协程融合两者优点。协程主要优势在于减少内核线程上下文切换指令开销和改善内核 CFS 的调度延迟。
  • 快手 Java 透明协程技术的演进之路:快手启动 Java 透明协程项目,意义重大,包括提升运行效率、编程效率和适应云原生架构演进。在方案选型上,综合考虑选择了基于 Dragonwell 社区的 Wisp 协程方案,并对其架构进行了演进,包括社区协程架构及缺陷、调度 CPU 优化、调度抢占优化、IO 模型优化等,最终完成了快手 Java 协程架构的整体升级。
  • 协程落地成果与未来展望:快手在 Java17 上实现了透明协程,服务极限 QPS 提升 30% 以上,节省了数千万服务器成本。未来将致力于与 Loom 的深度融合以及调度策略与调度器的解耦等方面的探索与改进。

Java程序中的潜在危机: 深入探讨NullPointerException

本文深入探讨了 Java 语言中的空引用(NullPointerException)问题,包括其起源、虚拟机处理方式、隐含风险以及 JDK 的改进措施等方面,最后对异常处理机制进行了总结和展望。

  • NullPointerException 的起源:1965 年 Tony Hoare 在设计 ALGOL W 语言时引入空引用概念,初衷是方便表示无值或未知值,且借助编译器自动检测确保引用使用安全、实现简单。但后来他反思这是个十亿美元的错误,Java 等语言也受此影响。
  • 空引用检查:Java 虚拟机不主动识别空引用,采用类似于 Try-Catch 的方案,只有在发生空引用时才处理(抛出 NullPointerException)。检查细节中,JDK8 虚拟机内部判别是否需要检查空引用,采用基于 signal 的方式,最终如果空引用,访问内存时会触发操作系统层面的异常。
  • 空引用操作系统处理:当发生空引用时,会触发操作系统层面的 SIGSEGV 信号。Java 虚拟机在启动时注册信号捕获 SIGSEGV,设置回调函数,在不同架构下有不同实现。捕获后的行为是设置拦截后的跳转代码,抛出 Java 层面的 NullPointerException,或者在某些情况下终止进程。
  • 使用信号量的隐含风险:频繁的空引用会使处理路径变长变慢,但虚拟机开发者假设正常系统不应有大量空指针异常。同时,如果 JVM 加载的第三方 JNI 中也捕获了 SIGSEGV 信号,会导致虚拟机自身的捕获失效,系统可能崩溃。
  • JDK 的改进:JDK8 引入 Optional 容器类,提供更安全清晰的方式处理可能为空的值,减少 NullPointerException 的发生,增强代码健壮性和可读性。JDK14 生效的提案 JEP 358 可增强 JVM 生成的 NullPointerException 的可用性,给出详细信息指明空对象。
  • 结语:深入了解虚拟机处理 NullPointerException 的过程,能更好理解异常处理机制的内在原理,提升编程技能,为处理类似问题提供深刻视角和解决方案。

最后更新: March 8, 2025