前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java的即时编译

Java的即时编译

作者头像
每天学Java
发布2020-06-02 09:57:37
7660
发布2020-06-02 09:57:37
举报
文章被收录于专栏:每天学Java每天学Java

程序执行效率应该是每一位程序员都关注的地方,一般来说,程序执行效率一部分依靠程序员编写的代码,一部分依赖程序执行的平台,在Java中,虚拟机就是平台,如何让程序执行更有效率也是虚拟机是否优秀的关键指标。

代码层面上代码优化不是本篇文章范围,本篇文章主要看一下技术平台上对效率的优化。

01

编译型和解释型

如果是计算机专业的同学,在大学期间C,C++,Java等计算机高级语言肯定都学过,都会知道C/C++语言被定义为编译型语言,而Java被认为是解释型语言,那么什么是编译型什么是解释型呢?计算机不能直接的理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言的编写的程序。翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。可见这两种方式的目的都是为了让高级语言能运行在平台之上,那么他们有什么区别呢?一般来说:解释型语言可移植性好,但是因为运行需要解释环境,所以运行效率较低,相对的编译型语言可移植性差,但是运行速度就要比解释型快很多。

有过Java和C项目部署经验的人都知道,部署Java项目不用考虑Windows环境还是Linux环境,而C就不一样,C语言程序进行移植后,需要重新编译(如Windows编译成ext文件,Linux编译成erp文件)。这是为什么呢?因为Java程序首先需要被编译器编译成class文件,如果在Windows平台上运行,则通过Windows平台上的Java虚拟机进行解释。如果运行在Linux平台上,则通过Linux平台上的Java虚拟机进行解释执行。所以说能跨平台,前提是平台上必须要有相匹配的Java虚拟机。而C语言开发程序后,需要通过编译器把程序编译成机器语言(即计算机可以识别的二进制文件,因为不同的操作系统识别的二进制文件是不同的)

既然Java程序属于解释型语言,那么执行效率差就是它的一个缺点了,那么Java虚拟机在Java运行效率上如何改善和提高的呢?

02

JIT编译器

注:下面所说Java虚拟机所指为HotSpot。

Java程序最初是通过解释器进行程序的解释执行的,当虚拟机发现某个方法或代码块运行比较频繁的时候,就会把这些代码定义为热点代码。为了提高热点代码的执行效率,Java虚拟机在程序运行时将这些代码编译成与本地平台相关的机器码,并进行各种层次的优化(哪些层次的优化,这里先不说),完成这个任务的编译器叫做即时编译器(Just In Time Compiler),简称JIT编译器。

JIT编译器并不是虚拟机必须的部分,Java虚拟机规范(这是一本书,大家可以网上购买或者公众号发送Java虚拟机规范获取pdf网盘下载地址)并没有规定Java虚拟机内必须要有JIT编译器存在,更没有限定或指导即时编译器应该如何去实现。但是,JIT编译器性能的好坏,代码优化程度的高低却是衡量一款商业虚拟机优秀与否的最关键指标之一。

既然JIT编译器如此重要,那么在HotSpot内的JIT编译器到底是怎么样的一个运作过程呢?HotSpot虚拟机采用解释器和编译器共存的架构(不是所有Java虚拟机都采用这种架构,比如JRockit),解释器和编译器拥有各自的优势,解释器能迅速启动和执程序,而在程序运行之后,编译器把越来越多的代码编译成本地代码,获取更高的执行效率。

HotSpot虚拟机中内置了两个即时编译器,分别称为Client Complier 和Server Complier或者简称C1编译器和C2编译器,目前主流的HotSpot虚拟机中,默认采用解释器与其中一个编译器直接配合的方式,具体使用哪个编译器取决于虚拟机运行模式,用户也可以使用“-client”或“-server”参数去强制修改编译器模式。

无论采用的编译器是C1还是C2,解释器和编译器搭配的方式都称为混合模式(Mixed Mode),用户可以使用-Xint参数强制虚拟机运行与解释模式(interpreted mode)或者使用-Xcomp参数强制虚拟机运行与编译模式(complied mode)。如下:

由于即时编译器编译本地代码需要占用程序运行时间,要编译出优化程度更高的代码,所花费的时间可能更长;而且想要编译出优化程度更高的代码,解释器可能还要替编译器收集性能监控信息,这对解释执行的速度也有影响,为了在程序启动相应速度和运行效率之间达到最佳平衡,HotSpot虚拟机会逐渐启用分层编译的策略。

第0层,程序解释执行,解释器不开启性能监视功能(Profiling),可触发第1层编译。

第1层,也称为C1编译,将字节码编译成本地代码,进行简单、可靠的优化,若有必要将加入性能监控的逻辑。

第2层,也称为C2编译,也是将字节码编译成为本地代码,但是会启动一些编译耗时较长的优化,甚至会根据性能监控进行一些不可靠的激进优化。

实施分层编译后,C1和C2编译器会同时工作,有些代码可能多次编译,用C1获取更高的编译速度,C2获取更好的编译质量,在解释自行的时候也无需承担收集性能监控信息的任务。

这篇文章就先说到这里,下一篇文章我们再看一看HotSpot虚拟机定义热点数据具体方法。

离春节越来越近了,希望在外工作和上学的小伙伴都能抢到回家的票。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
应用性能监控
应用性能监控(Application Performance Management,APM)是一款应用性能管理平台,基于实时多语言应用探针全量采集技术,为您提供分布式性能分析和故障自检能力。APM 协助您在复杂的业务系统里快速定位性能问题,降低 MTTR(平均故障恢复时间),实时了解并追踪应用性能,提升用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档