Java虚拟机--JIT编译器

摘要:
HotSpot虚拟机中内置两个JIT编译器:ClientCompiler和ServerCompiler,分别用在客户端和服务端,目前主流的HotSpot虚拟机默认是采用解释器和其中一个编译器直接配合的工作方式。在《深入理解Java虚拟机》中有这样一段话:“随着JIT编译器的发展和逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象分配到堆上也渐渐不那么绝对了”。

1.什么是JIT编译器

JIT编译器,即Just-In-Time Compiler(即时编译器)。JIT编译属于动态编译(即运行时编译)的一种,与之对应的是静态编译(AOT)。

2.为什么要用JIT编译器

我们都知道,通常通过javac将程序源代码编译(前端编译,与语言有关,机器无关)成字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多,这就是传统的解释器(Interpreter)的功能。为了解决这种效率问题,引入了JIT技术。

3.JIT编译器是如何工作的

Java虚拟机--JIT编译器第1张

JIT 工 作 原 理 图

Java程序还是通过解释器进行解释执行,当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code),然后JIT会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后把翻译后的机器码缓存起来,下次可以直接使用。

HotSpot虚拟机中内置两个JIT编译器:Client CompilerServer Compiler,分别用在客户端和服务端,目前主流的HotSpot虚拟机默认是采用解释器和其中一个编译器直接配合的工作方式

当JVM执行代码时,它并不会立即编译代码,原因有两点

■ 如果这段代码本身只会被执行一次,那从本质上看,编译器就是在浪费精力,因为将代码翻译成Java字节码(解释器解释执行)相对于编译这段代码并执行代码来说,要快很多。

■ 最优化,当JVM执行某一方法或执行遍历的次数越多,就会更了解代码结构,那么JVM在编译代码时就做出了相应的优化。

我们可以看自己机器上安装的JDK中JIT是哪种模式:

Java虚拟机--JIT编译器第2张 

其中,无论是Clent还是Server,都是mixed mode,即解释器和编译器搭配使用的混合模式。

注:Client启用的是代号为C1的编译器,是轻量级编译器;Server启用的是代号是C2的编译器,时重量级编译器。

4.热点检测

想要触发JIT编译,就要先识别出热点代码,目前主要的热点代码识别方式是热点探测,有两种方式:

基于采样的方式探测:周期性检测各个线程的栈顶,发现某个方法经常出现在栈顶,就认为是热点方法。好处是简单,缺点是无法精确确认一个方法的热度,容易受线程阻塞等原因的干扰。

基于计数器的热点探测:采用这种方法的虚拟机会为每个方法,甚至代码块建立计数器,统计方法的执行次数,某个方法超过阀值就认为是热点方法,触发JIT编译。

在HotSpot虚拟机中使用的是基于计数器的热点探测,它为每个方法准备了两个计数器:方法调用计数器和回边计数器。

方法调用计数器:记录一个方法被调用次数。

回边计数器:记录方法中的for或while的运行次数的计数器。

5.所有对象都分配到堆上吗?

在《深入理解Java虚拟机》中有这样一段话:“随着JIT编译器的发展和逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象分配到堆上也渐渐不那么绝对了”。这是由于在编译期间,JIT会对代码做很多优化,其中有一部分优化的目的就是减少内存堆分配的压力,其中一项重要的技术叫做逃逸分析

逃逸分析是目前Java虚拟机中比较前言的优化技术,这是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,HotSpot编译器能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,可以被外部方法调用,则称为方法逃逸

对于定义在方法内部的对象,不会逃逸到其方法外部,经过JIT的逃逸分析,就会对其内存分配进行优化。结果就是,如果循环定义1万个对象,大多数会分配到栈上,减轻堆的压力。

免责声明:文章转载自《Java虚拟机--JIT编译器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NPOI操作Excel(二)--创建Excel并设置样式top命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ping内网一台虚拟机延时很大(hyper-v虚拟机)的解决办法

问题现象: ping 内网一台虚拟机延时很大,不稳定,造成业务系统响应慢。查看服务器上各种资源都正常。 解决办法: 在物理机上找到和hyper-v绑定的那个网卡,把“虚拟机队列”禁用掉就好了,如下图: 网上解释:启用虚拟机队列(VMQ)旨在通过加速网络数据从物理适配器传输至相应虚拟机来提高网络性能,但似乎对某些Broadcom网络适配器产生相反的效果,...

虚拟机安装中标麒麟桌面版7.0系统 + 升级Firefox浏览器

背景 由于公司业务(政府项目)需要走国产化路线,需要把原来已有的产品在国产的系统进行测试。目前选择的是中标麒麟系统,这是一款国产系统,界面 UI 和 window 类似,系统内核使用的是 Linux 的,说白了就是 window + linux 的结合体。 在虚拟机中安装中标麒麟系统 准备工作 虚拟机软件:VMware12 系统镜像:中标麒麟系统7.0...

用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker

如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机。但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的。这个时候我们可以使用Docker。Docker可以看做是一种轻量级的虚拟机,占用资源少,用起来和传统的虚拟机很像,使用的时候可以类比VMware或VirtualBox。本文不能让你精通Docker,但能让...

Autoit安装及启动

1、Autoit下载:   官网下载地址:https://www.autoitscript.com/site/autoit/downloads/   提供百度网盘下载:https://pan.baidu.com/s/17l5fOlz_ZHjoHxnQwiQBYA(如果链接失效,请在评论中索要,会在评论中再次给出) 2、Autoit安装:   安装教程一般百...

IDEA连接虚拟机

idea配置连接 转自:https://blog.csdn.net/chengbai121444/article/details/84334959 1、打开链接配置(Tools-->Deployment-->Configuration) 2、自定义虚拟机名称和连接方式(连接方式选择SFTP) 3、配置虚拟机具体信息 4、展示虚拟机页面...

VMWare虚拟机网络的三种工作模式

VMWare提供了三种工作模式:   1.bridged(桥接模式)   在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。在桥接模式下,需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个...