JAVA虚拟机25---编译器,解释器,JAVA中的即时编译
https://www.cnblogs.com/somefuture/p/14272221.html
1.简介
编译器:是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往是以二进制的形式被称为目标代码(object code)。这个转换的过程通常的目的是生成可执行的程序。
解释器:是一种计算机程序,会一行一行的读取源代码,解释,然后立即执行。这中间往往使用相对简单的词法分析、语法分析,压缩解释的时间,最后生成机器码,交由硬件执行。(可以理解为边编译边执行)。解释器适合比较低级的语言。但是相对于预编译好的代码,效率往往会更低。
2.编译器图示
源代码被编译成机器码,在CPU上运行。
3.解释器图示
用解释器很方便,只需要直接“运行”就好了,不用有编译的工序。
为什么我们一般说解释器的效率比较低?你也可以想象的是,一段程序在解释器中运行时可能会被编译多次,因为每次运行到这段程序时,都会重新编译一次,这样的开销是很大的。
4.JAVA的模式
JAVA在运行之前,需要手动把源代码编译成中间代码(字节码),然后在解释器中执行。这种架构避免了上面纯解释器中编译源代码的开销,所以相对会有效率一些。当然,处理解释执行,还有热点代码即时编译。
5.JAVA中的即时编译JIT
5.1JIT简介
Java发展这么多年一直长青,很大一部分得益于开发人员长期对其坚持不懈的优化:写得更少,跑得更快!JIT就是其中一项十分重要的优化。
JIT全程Java Intime Compiler,即Java即时编译器。
从我们最早接触Java编程开始,学习到的就是手写java文件,然后javac编译、java运行主方法。
javac会把.java文件编译成.class文件(预编译),所以我们说Java是编译型语言。
为了实现“一次编写,随处运行”的目标,字节码会被jvm运行。而这里的运行就是解释执行,jvm是一行一行阅读字节码文件中的jvm指令,并把它翻译成机器的cpu指令。这个过程就比较慢了。
Java为了提高开发和运行效率,已经对语言和jvm在多方面做了优先,包括垃圾回收器、各种锁机制,甚至最简单的分支预测都大力优化。解释执行的效率自然也被纳入优化范围。在1996年10月25号,当时的Java东家Sun发布了第一款JIT编译器。那时还是java 2刚出来,离现在已经20多年了。目前JIT已经是默认开启的,因为它带来的效果明显。除非通过参数指定不使用。
5.2JIT和热点代码
JIT的设计基于“二八定律”,20%的热点代码占据了程序80%的执行时间
即使开启了JIT,也少不了代码编译和字节码解释的过程。JIT处理的是热点代码(hotspot code,或叫热门代码)。热点代码就是频繁执行的代码块,比如循环里面的代码。只有热点代码会被即时编译执行,其它的还是解释执行。JIT有一套逻辑判断是否热点代码。
5.3为什么不把全部代码编译执行,而是部分热点代码即时编译执行,其它代码解释执行
这是由于编译本地代码比较费时间,而且编译后还要进行进一步的优化导致耗时更久;而解释器是能够立即解释字节码文件的,毕竟我们的应用放到服务器上的时候就已经是字节码文件了,解释器可以拿来直接用。
而且解释器执行的时候占用的内存更小,在内存受限的场景难以使用编译器(比如手机上)。
编译器会概率性地选择多数时候都能提升运行效率的手段进行优化,如果“优化”后发现还不如不优化(甚至执行有问题)就得“逆优化”,回退到解释执行状态。
5.4查看Java是否使用了编译器
java -version
最后输出的“mixed mode”代表是混合模式,也就是先解释执行,并逐步将热点代码代替为机器代码。不使用编译器的模式叫“interpreted mode”;优先使用编译器的模式叫“compiled mode”,compiled mode会优先采用编译方式执行程序,如果编译执行有问题就回退到解释执行。
最新文章
- HDU5361 In Touch(线段树 + 最短路)
- 过滤eWebeditor等富文本中html标签,获得纯文本信息
- Asp.Net 三层架构之泛型应用
- CSS3 box-shadow快速教程
- jQuery 请指出'.bind()','.live()'和'.delegate()'的区别
- CF Tavas and Nafas
- css属性分类介绍
- MVC设计模式的简单理解
- [AtCoder3856]Ice Rink Game - 模拟
- 单体 VS 微服务
- PTA——字符串逆序
- 使用C#的aforge类库识别验证码实例
- Docker入门基础(一)
- mybatis一(常用配置信息和获取插入后id)
- MongoDB常用查询,排序,group,SpringDataMongoDB update group
- dUMP:A new value is to be assigned to the field ";<;L_BOX>;";
- 2016-2017-2 20155312 实验二《Java面向对象程序设计》实验报告
- Python MySQL - 创建/查询/删除数据库
- 数组中累加和小于等于k的最长子数组
- Datagridview 在基于文本的单元格中启用换行,自动调整行高列宽
热门文章
- 云实例初始化工具cloud-init简介
- 机器学习模型评价指标之ROC 曲线、 ROC 的 AUC 和 投资回报率
- JDK动态代理深入剖析
- 解决python3解压文件名乱码问题(unzip)
- win7修改开机动画
- win7使用onedrive右键托盘图标中文不显示问题
- MyEclipse 中自动安插作者、注释日期等快捷键方法
- 【每日一题】【双指针、位运算】2022年2月3日-NC103 反转字符串
- bug处理记录:Error running &#39;WorkflowApplication&#39;: Command line is too long. Shorten command line for WorkflowApplication or also for Spring Boot default configuration?
- 解决 ERROR: Could not find a version that satisfies the requirement xxx 的问题