在4月份,华为P30系列发布会上,华为消费者终端业务CEO余承东除了给消费者带来了万众期待的华为P30 Pro,还公布了一个全新的黑科技:华为方舟编译器。该编译器可以改善安卓应用编译效率,从原先的边解释边执行转变为全程机器码高效运行程序。称华为方舟编译器可使手机的流畅度最高提升60%,因而引起广大网友的热烈反应。

那么今天就借着华为方舟编译器一事所激起的热火朝天的大讨论。来介绍下JVM里和编译相关的两个有趣的小知识。JVM的机器码和通常所说的机器码一样吗?来看图1:

图1  目标机器码的依赖关系

图1中:

  • 右边是C/C++源码编译成目标机器码的情况。该目标机器码编译,运行时只和目标的操作系统和相关库有关。

  • 而Dex/Java字节码虽然也编译成目标机器码,但是它的编译和运行不仅仅依赖操作系统,还依赖具体的虚拟机实现。比如Dex字节码编译成机器码的话就依赖ART虚拟机。

很多人以为Java字节码编译成机器码后就能和那些C/C++编译得到的机器码一样无所羁绊的直接在OS上运行了,殊不知在Java字节码编译为机器码的过程中,虚拟机会添加一些必要和特殊的指令,使得得到的机器码在运行过程中实际上离不开虚拟机的管控。JVM编译的机器码叫managed code,即JVM管控的机器码。为什么要管控呢?来看一个例子:

  • Java虚拟机的垃圾回收器做对象标记前,往往会设置一个标志,表示自己要做对象标记了。

  • 其他线程运行时要经常检查这个标志,发现这个标志为true时,这些线程就得等待,好让垃圾回收器能安全的做对象标记。否则的话,垃圾回收器一边做对象标记,其他线程同时又去创建对象、或更改对象间的引用关系,这将导致对象标记不准确,影响垃圾回收。

显然,程序员在代码中是不会主动加上这个检查标记的动作。实际上,这是由编译器在机器码编译过程中主动添加相关检查标记的指令来完成的。

再举一个更简单的例子,Java中内存分配new的实现和C++的new实现不同。Java中分配内存是要经手JVM的,如果内存不够,JVM还会触发垃圾回收。而C++的new则直接和OS打交道。

将Java字节码编译成机器码是因为了提高程序的运行速度。但在某些情况下,我们还得从机器码运行模式退回为解释执行模式。比如,Java语言规范中对ArrayIndexOutOfBounds(简写为AIOOB)异常抛出有明确要求,只能在运行到索引越界处才抛出。例如,一个数组长度为10,而循环次数为20,索引从0开始每次循环递增1,那么在这20次循环中,前10次都不能触发AIOOB异常,只有第11次才能触发。出现这种情况的话,虚拟机有可能从机器码执行退回到解释执行。ART 中专门提供有一个名为HDeoptimize指令,用于这种从机器码执行退化为解释执行的相关操作。来看一个能触发HDeoptimize的例子:

class Am{//注意,我对Am.java进行了修改。
static int[] arrays = null;//静态数组
//main函数,它会编译成机器码。所以,下面讨论main函数的执行时,它是以机器码方式来
//执行的
public static void main(String[] args) {
//arrays数组的大小由执行时的第一个参数决定
arrays = new int[Integer.parseInt(args[0])];
/*给arrays的前3个成员赋值。会出现两种情况:   1 如果arrays的长度大于3,则一切正常。代码依然以机器码方式执行。 2 如果arrays的长度小于3,则整个循环会以解释模式执行。 */
for(int i = 0; i <3;i++) {
arrays[i] = i;
}
return;
}
}

上述代码中,如果输入的数组长度小于3,则整个循环会退回到解释模式执行。

这里要特别说明的是,如果代码中加上try/catch的话,将不会触发HDeoptimize的处理。所以,HDeoptimize虽然是一个反优化的手段,但实际上触发它运行的几率并不大。

更多关于ART JVM的知识,大家可尝试阅读和学习此书《深入理解Android:Java虚拟机ART》,这是一本《深入理解Android》系列最后一本压轴巨著。

《深入理解Android ART JVM》

扫码或者点击阅读原文查看书籍详情

这里要简单说明一下,这本书定价169,看起来不便宜,但按页数算的话比那些300多页定价70-80多的书反而要便宜一些。

为什么要推荐此书?

  • 作者是邓凡平,资深Android技术专家,从2011年开始研究和分析Android源代码,是国内Android源码分析领域的奠基人物

  • 全书word原稿有1300多页,编撰出版后有930多页,是一本名副其实的厚作。

  • 这本书对ART JVM相关的知识都有比较详细的源码剖析。如果涉及到一些必备的基础知识(如编译技术、ELF、垃圾回收等),也会以理论联系实际代码的形式在书中给你展现出来。

  • 这是一本《深入理解Android》系列最后一本压轴巨著,之前出版过6本《深入理解Android》系列书籍,其中《深入理解Android 卷I》、《深入理解Android 卷II》以及《深入理解Android:Wi-Fi、NFC和GPS》这三本书已经不再出版。为了保证知识的传承,作者在CSDN网站上提供这三本书的电子版下载(https://blog.csdn.net/Innost/article/details/43342087)。

所以作为Android的开发者这是必读的书籍。以上!

扫码购买或者点击阅读原文查看书籍详情

这四个Python项目,让你瞬间读懂Python!

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

华为方舟编译器是黑科技?相关推荐

  1. 华为“方舟编译器”到底是啥?一文看懂TA如何让手机性能再突破

    在华为春季发布盛典上,除了"HUAWEI P30"还有一个词也火了一把,那就是全新黑科技--"华为方舟编译器"! 先花一分钟,戳视频链接简单了解下 方舟编译器虽 ...

  2. 华为方舟编译器正式开源,采用自主平台托管

    前不久华为开发者大会上,华为给出了鸿蒙OS及方舟编译器的开源时间表,这着实让开发者们兴奋了一把.现在华为兑现承诺,8月31日,华为方舟编译器开源官网正式上线了. 方舟开源,自主托管 根据公布的信息,本 ...

  3. 重磅!华为方舟编译器招募 2000 程序员!

    作者 | 胡巍巍 出品 | 程序人生(ID:coder_life) 华为北京研究所的食堂,周末也好热闹! 9月7日,笔者到华为北研所,参加华为方舟编译器(以下简称"方舟")的开源主 ...

  4. 华为方舟编译器招募 2000 人!

    作者 | 胡巍巍 出品 | 程序人生(ID:coder_life) 华为北京研究所的食堂,好便宜! 9月7日,笔者到华为北研所,参加华为方舟编译器(以下简称"方舟")的开源主题沙龙 ...

  5. 华为方舟编译器开源官网正式上线

    [摘要] 8月31日,华为方舟编译器开源官网正式上线. 本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR)和语言编译实现,同时搭配编译器其他二进制组件,实现Java程序到aarch6 ...

  6. 中国首个芯片大学最快于本月底在南京挂牌;​华为方舟编译器正式支持 C 语言;Ora2Pg v21.0 发布|极客头条

    整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 国内 ...

  7. 华为方舟编译器 PK 微软苹果谷歌编译器,到底谁胜出?

    记者 | 胡巍巍 受访者 | 刘新铭 出品 | CSDN(ID:CSDNnews) 近日,华为方舟编译器终于正式开源,兑现了在2019年8月开源的承诺. 与此同时,其代码不在GitHub,而是在自家开 ...

  8. 华为方舟编译器开源!前华为人重磅解读!

    [CSDN 编者按]8月31日,华为方舟编译器正式开源.据华为内部人士表示,华为员工为了这次开源,连续30小时没有合眼. 早在在8月9日的华为开发者大会上,华为消费者业务CEO余承东,就宣布将在8月底 ...

  9. 支付宝澄清使用华为方舟编译器;三星苹果遭遇集体诉讼;PHP 7.4.0 beta4 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

最新文章

  1. 百例1-10(一到三章)总结
  2. Linux Java Web 服务器搭建之tomcat安装
  3. C语言使用fopen的两点注意事项
  4. 电气:6机30节点经济调度(考虑负荷平衡和线路容量,不考虑斜坡)代码实现
  5. Arrays类的排序(sort、parallelsort)
  6. js实时获取窗口大小变化
  7. Java笔记3:Eclipse添加jar包
  8. 较为详细的MUSIC算法原理及MATLAB实现
  9. paddle 图标注_数据标注工具大全汇总,有了这些工具再也不用自己开发了
  10. 微信公众号开发(个人订阅号)
  11. PC端微信缓存清理方法
  12. 模拟无线透传的STM32的24L01无线模块与串口USART通信
  13. 用c/c++和Java语言实现庞加莱回归
  14. <Zhuuu_ZZ>让我们来康康脚本流程控制
  15. 督查督办管理系统在企业管理中起到的作用
  16. 简单笔记(rsrp/mbps/session/dialog/dbm)
  17. 微信加密聊天工具(持续开发中)
  18. JVM--查看堆栈信息
  19. 异常(Exceptions)
  20. KL散度的含义与性质

热门文章

  1. jetson nano 在opencv拉流的视频上显示中文汉字(含c++完整源码)
  2. 【QT】QT从零入门教程(八):QT常用控件 [QLabel、QPushButton、QLineEdit、QTextEdit]
  3. 【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)
  4. Linux使用I/O复用函数的超时机制的定时器
  5. Flutter进阶—Firebase数据库实例
  6. 中国碳酸亚乙酯(EC)(CAS+96-49-1)行业市场供需与战略研究报告
  7. 中国天然石墨行业市场供需与战略研究报告
  8. 2021年中国助听器电池市场趋势报告、技术动态创新及2027年市场预测
  9. 构建前端Mock Server的利器/Json-Server
  10. python中serial模块的使用_python中pyserial模块使用方法