[杂记]方舟编译器初识

Java 程序的执行依赖于Java虚拟机。虚拟机中自带了两个:解释器、编译器。解释器就像现场翻译,听一句翻译一句给编译器;编译器结合上下文对整段话进行翻译。

方舟编译器跨过了VM这道坎,将高级语言直接编译成机器码,消除了动态编译的开销。

另一方面,安卓在内存回收上采用集中回收机制,发声全局回收时更需要暂停应用,这也是随机卡顿的根因之一。而方舟编译器提供了更高效的内存回收机制,回收时无需暂停应用,随时用随时回收,大大提高运行速度。

方舟编译器由于是在应用开发阶段进行编译,所以可以允许不同应用灵活采用不同的编译优化方案,而且因为在开发环境编译不会受到手机性能的限制,可以使用更多先进的优化算法,从而使得每个应用的性能达到最佳。


主要看下关于垃圾回收部分的内容:
方舟编译器垃圾回收算法,在垃圾回收方面采用的是RC计数优化算法(计数参数是ref)加消除环算法(改进版–标记消除环)。

其实RC计数中最明显的问题应该是循环引用,一旦两个对象循环引用,其引用计数始终是2,无法归零回收。采用消除环算法(就是AB循环引用了,最后都要给AB对象赋值NULL,从根节点上走就碰不到循环引用无法回收的问题了)可以解决这个问题,不过方舟在这方面做得改进更加智能。

为避免内存被这些环的死循环占用,方舟引入了标记处理,就是对这些环进行管理和标注,就是在编程阶段,出现环问题时就要警告你这么做危险,这样子可以减少大部分程序中环的出现。另外一方面,方舟编译器在运行状态下引入了高效的环回收机制,允许有选择地智能回收某个APP的内存占用,对于传统环回收算法来说这是很强大的一个改进。


编译流程:
1.输入语言java语言,在java-core库的作用下,生成机器码(.class)文件;

2.方舟编译器启用jbc2mpl程序段,将机器码(.class)文件转化为编译器中间优化层IR可以识别的程序代码(.maple);

3.方舟编译器将启用mpl2mpl程序段,将前面生成的草稿级别的mpl代码(.maple)进行优化前的准备工作,包括类分层、内容识别等等,再生成进阶级mpl代码(.maple);

4.方舟编译器将进阶级mpl代码(.maple)丢到中间优化层IR中,经过多个级别的优化和降级,生成优化级mpl代码(.maple);

5.方舟编译器启用mplcg,将优化级mpl代码(.maple)根据目标平台的不同转化为不同的目标代码。比如一些云平台或者单片机平台使用纯binary(二进制),比如linux等系统可以使用汇编语言,再比如华为方舟引擎(maple engine)使用byte(字符)级数据等等。

引用: 知乎.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值