作者 | 黄玄 编译 | 梦依丹
出品 | CSDN(ID:CSDNnews)
近日 , React Native在官博宣布Hermes成React Native默认Java引擎 。 Facebook工程师黄玄在官博中阐述了Hermes自2019年发布以来 , 为推动Hermes成为React Native 成为Java引擎取得的一些进展 。
目前 , Hermes被越来越多的社区所采用 。 Expo团队正基于React Native应用程序维护一个流行的元框架 , 并宣布对Hermes进行实验性支持 。 此外 , 移动数据库Realm团队也宣布对Hermes提供alpha支持 。
Hermes简介
Hermes是Facebook在Chain react 2019大会上发布的一个崭新Java引擎, 小巧轻便 , 针对在Android上运行React Native 进行了优化 。
对于许多应用程序 , 只需启用Hermes即可缩短启动时间、减少内存使用量并缩小应用程序大小 。
专为 React Native 而优化
据Hermes的功能定义 , 它会负责如何提前执行编译工作 , 这意味着启用 Hermes的React Native应用程序附带了预编译优化的字节码 , 而不是纯 Java 源码 。 这大大减少了用户启动产品所需的工作量 。 据Facebook和社区应用程序的测试表明 , 启用Hermes通常会将产品的 TTI(或交互时间)指标减少近一半 。
话虽如此 , 团队一直致力于在许多其他方面改进Hermes , 以使其作为专门用于React Native的Java引擎变得更好 。
为 Fabric 构建一个新的垃圾收集器
随着新React Native架构中Fabric渲染器的到来 , 它可以在UI线程上同步调用Java , 这也意味着如果Java线程执行时间过长 , 可能会带来UI丢失 , 并导致用户无法输入 。 为避免Java任务调度冗长 , React Fiber提供的并发渲染机制是将工作拆分成多个块来执行 。 此外 , Java 线程还有另一个常见的延迟来源——垃圾收集(GC)机制 。
【Hermes将成React Native默认的JavaScript引擎】Hermes 以前的默认垃圾收集器 GenGC 属于单线程分代垃圾收集器 。 新生代采用典型的半空间复制策略 , 老一代采用mark-compact策略 , 使其更擅长积极地将内存返回给操作系统 。
由于是单线程执行 , GenGC长时间运行会导致GC暂停 。 在像 Facebook for Android 这样的复杂应用上 , 平均暂停时长为 200 毫秒 , 而第 99 百分位暂停则为 1.4 秒 。 考虑到 Facebook for Android 庞大且多样化的用户群体 , 最极端的暂停时间甚至会长达 7 秒 。
为缓解这种情况 , 黄玄在博客中表示 , 他们正在实施一个全新的 , 执行多并发操作的垃圾回收方案 , 名为Hades 。 Hades与GenGC的回收方式完全相同 , 它可以通过在后台线程中执行大部分工作来缩短GC 暂停时间 , 并且还不会阻止引擎的主线程执行 Java 代码 。 从统计数据来看 , Hades 在 64 位设备上第 99.9 百分位上的延迟为 48 毫秒(比 GenGC 快 34 倍!) , 而在 32 位设备上第 99.9 百分位上的延迟约 88 毫秒(单线程增量 GC 的形式运行) 。
由于需要更高的写屏障、基于空闲列表的分配机制(与碰撞指针分配器相反)和更多的堆碎片 , Hades通过整体吞吐量来换取暂停时间的优化 , 这被官方认为是正确的权衡 , 接下来会通过合并和其他内存优化讨论来降低整体的内存消耗 。
攻破性能痛点
应用程序的启动时长对许多应用程序的成功至关重要 , 官方团队正在不断提升 React Native 的性能边界 。 对于Hermes实现的任何新Java功能 , 他们都会进行仔细监控 , 观察它们对性能的影响 , 并确保它们不会拉低指标 。
目前 , Facebook团队正在为 Metro 中的 Hermes 试验专用的 Babel transforms 配置文件 , 以用 Hermes 的原生 ESNext 实现来替换是十几种 Babel transforms。 目前已观察到 18-25% 的 TTI 改进和整体字节码大小的减少 , 希望接下来的 OSS 也能产生类似的结果 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
