作者 | 黄玄 编译 | 梦依丹
出品 | 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 以前的默认垃圾收集器 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 的形式运行) 。
推荐阅读
- AMD|AMD 350亿美元收购赛灵思交易完成时间推迟 预计明年一季度完成
- Apple|摩根大通分析师:交货时间来看iPhone 13系列已达供需平衡
- Microsoft|微软推Viva Insights插件 定时邮件可根据时区推荐发送时间
- 认识论|管理好时间,是最有价值的投资
- 新闻|(暂不发)2021新闻年历|你不停翻着新闻,寻找时间的故事
- IT|世卫组织:2022年或将成为新冠疫情危急阶段的终结
- 发射|我国成功发射天绘-4卫星
- 市场|搅局者来了 未来显卡市场将三足鼎立 N/A格局或将成为历史
- 流程|哈尔滨机场“全流程自助安检”来了,过检时间或将缩短一半
- 全球|尼康 Z 9 相机产量不足,经销商到货时间延长至 2022 年 10 月
