第4章jit编译器

ashoftime ashoftime     2022-12-08     784

关键词:

4.1 JIT概览

  语言根据执行的方式不同分为编译型语言和解释型语言。以C++为代表的编译型语言在执行前需要编译成机器码,不同的CPU需要不同的编译器,编译成功后在同一台机器不需再次编译。以Python为代表的解释型语言,解释器一行一行的解释执行Python代码。

  编译型语言的优势在于跨平台,只要平台能够提供相应的解释器都可以执行Python代码。其缺点在于效率,比如对于循环,每次循环都要重新解释执行,而对于编译型代码在循环开始前编译一次无需再次编译。

编译器的优化

  编译器在编译语言的时候需要一定优化,优化的结果是编写的代码和机器码是不同的。优化的目的是更好的利用CPU,降低CPU等待时间。优化的副作用是会在并发编程中带来可见问题。编译器一个重要优化是从内存里取变量优化成从CPU缓存或寄存器里取变量(volatile的味道)。

  技术图片

   按理来说sum的值应该在内存里,然后每次计算的时候从内存读到寄存器,然后累加完成写回去。但如果编译器在一开始把sum放到寄存器里,累加完成后写回内存,这样和内存交互只有一次。当然,这种编译器的优化带来的是并发编程的无尽问题。 

Java是怎么搞的

  Java走的是中间路线。javac把java代码编译成字节码,虚拟机解释执行字节码,并在解释执行的过程中把热点代码编译成汇编语言。由于编译的过程是在运行字节码过程中,所以被称为JIT,just in time,即使编译。

为什么不直接编译呢?

  • 如果一段代码只执行一次,编译的时间会大于解释执行的时间,所以只有那些反复执行的代码才有编译的必要,这些反复执行的代码被称为HotSpot。也只有在代码文件执行一定次数后,才能发现哪些代码是hotspot,这也是Java不直接编译的原因。
  • 一段代码执行的次数越多,编译的时候优化的结果就越好。比如java编译成class文件的时候是没有连接这一步的,所有的引用都是符号引用,需要在运行的时候判断真正引用地址。在多次执行代码的过程中能够发现一个符号引用总是指向某一物理地址,那么就可以在编译的时候直接把符号引用编译成物理地址,无需在运行的时候动态确定。

 

4.2 Client Server选择

  JVM启动参数,区别在于执行class文件时编译的时机不同。

  • client编译代码更早,编译器的优化更少,所以编译的类更多、质量更差。
  • server编译代码晚,编译后的代码“质量”更高,运行更快。

  为什么要这样?

  • 客户端程序生存周期短,需要加载的类较少,代码较为简单,更适合解释执行。而Server端程序复杂,运行时间更久,所以更晚质量更高的编译收获更大。
  • 客户端对启动时间更敏感。

 分层编译

  把server client统一起来的一种编译技术,在程序刚刚启动的时候使用client编译,等到程序热起来再切换成server。java8中默认开启分层编译。

 

4.4 与编译有关的虚拟机参数

  编译器缓存

  编译好的代码需要在JVM里缓存起来,当缓存被填满的时候就无法继续编译后续的热点代码。需要根据业务合理的提高该值。

  • -XX:ReservedCodeCacheSize 缓存最大值
  • -XX:initialCodeCacheSize 缓存初始值

  缓存从初始值开始分配符,最大分配到最大值。

  值得注意的是分层编译缓存很容易超出上限,尤其在Java7。

 

第4章function语意学

1.MemberFuncition的各种调用方式 Nonstaticmemberfuncion:      编译器将其转为nonmember Function的形式,转化步骤是:        (1)添加额外的参数----this指针&nb 查看详情

算法(第4版)

第1章基础第2章排序第3章查找第4章图第5章字符串 第1章基础 第2章排序 第3章查找 第4章图 第5章字符串     ------------------------------------------------------------------------------------------ 查看详情

第4章初始化和清除(下)

...初始化。packagecom.sunny.hello.c4;publicclassTest{voidf(){inti;//i++;编译错误,因为i未初始化}}但是,若将基本类型设为一个类的数据成员,情况则会变得稍微有些不同。由于任何方法都可以初始化或使用那个数据,所以在正式使用前,若... 查看详情

2018-2019-120189221书籍速读第1周

...,怎样进行不同机器之间的代码移植?第3章:C++和Java的编译器是怎样映射产生机器级程序?第4章:流水线型的处理器怎样进行基本的异常处理?第5章:乱序处理器操作具体是怎样?第6章:结合机要密码方面的知识,德国恢复已... 查看详情

66.javac编译与jit编译编译过程javac编译词法语法分析填充符号表语义分析字节码生成jit编译

66.javac编译与JIT编译66.1.编译过程66.2.javac编译66.2.1.词法、语法分析66.2.2.填充符号表66.2.3.语义分析66.2.4.字节码生成66.3.JIT编译66.javac编译与JIT编译66.1.编译过程不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转... 查看详情

html第4章css基础

  查看详情

[fabric]第11章fabricca应用与配置

文章目录11.1简介11.2安装服务端和客户端11.2.1本地编译11.2.2获取和使用Docker镜像(推荐)11.3启动CA服务11.4服务端命令剖析11.4.1全局命令参数11.4.2init命令11.4.3start命令11.5服务端配置文件解析11.6与服务端进行交互1.配置读取2.登记用... 查看详情

第二十三章程序集加载和反射

...序23.5 使用反射发现类型的成员23.1 程序集加载JIT编译器将方法的IL代码编译成本机代码时,会查看IL代码中引用了哪些类型。在运行时,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表来确定哪一个程序集定义了所有引用... 查看详情

算法(第4版)-1.4.7注意事项

...并不总是正确的。 ·系统因素某种垃圾收集器或是JIT编译器或是正在从因特网中进行的下载都可能极大地影响实验的结果。 ·不分伯仲在我们比 查看详情

《sql必知必会》读书笔记上(第1~15章)(代码片段)

目录第1章了解SQL第2章MySQL简介第3章使用MySQL3.1连接数据库3.2选择数据库3.3显示数据库和表3.4其他SHOW语句第4章检索数据4.1SELECT语句4.2检索单个列4.3检索多个列4.4检索所有列4.5检索不同的行(去重)4.6限制结果4.7使用完全... 查看详情

电力电子技术第4章逆变电路

查看详情

第2章基本概念(代码片段)

...个值过于庞大,无法存储于一个字符内,所以它的结果因编译器而异;/0123由两个字符组成,‘/012’和‘3’,其值因编译器而异;/x0123过于庞大,无法存储于一个字符内,其值因编译器而异。5.错误,不能简单理解... 查看详情

第4章

第四章1.MDI窗体应用  2.获取应用程序路径信息   3.窗体间传递复杂数据   4.无标题窗体两种拖动方法     5.winform开发常见问题       查看详情

现代软件工程第一章概论第4题——张功

第4题:Dijkstra曾经提到:“Softwareengineering,ofcourse,presentsitselfasanotherworthycause,butthatiseyewash:ifyoucarefullyreaditsliteratureandanalysewhatitsdevoteesactuallydo,youwilldiscoverthatsoftwaree 查看详情

第4章控制执行流程

第4章控制执行流程     ·控制语句——选择     ·关键字:if-else、while、do-while、for、return、break、switch4.1true和false     ·条件语句(条件表达式=true/false)  查看详情

第4章立项与项目启动

4.1 敏捷项目立项4.1.1 建立产品愿景1.电梯游说2.设计产品盒4.1.2 准备商业论证1.投资回报率(ReturnonInvestment,ROI)2.还本期(PaybackPeriod)3.内部报酬率(InternalRateofReturn,IRR)4.现值(PresentValue,PV)5.净现值(NetPresentValue,NPV)4.2&nbs 查看详情

jvm系列第4讲:从源代码到机器码,发生了什么?(代码片段)

...底发生了什么呢?这就是今天我们要聊的。如下图所示,编译器可以分为:前端编译器、JIT编译器和AOT编译器。下面我们逐个讲解。前端编译器:源代码到字节码之前我们说到:对于Java虚拟机来说,其实际输入的是字节码文件... 查看详情

《敏捷软件开发》第4章测试

《敏捷软件开发》第4章测试4.1测试驱动的开发方法答:作者的意思应该是说,先有测试方案,这样可以引导、督促开发人员向正确的方向写代码。4.1.1一个测试优先设计的示例答:作者以一个游戏为例,说明了测试优先设计。4.1... 查看详情