JIT介绍

ec8702142c6d445f86efc899aca150ea.jpgJIT全称:Just in time。中文译为:即时的、实时的。

 

 

JVM中的这项技术名为:实时编译技术,也叫即时编译技术。就是在java程序运行的过程中,将字节码编译为机器码运行在本地,而不是通过JVM解释运行(字节码都是通过JVM解释运行的)。

 

我们先来思考一个问题,java代码是如何“跑起来”的?

 

我们编写好的java代码,通过点一下IDE中的运行按钮,就看到程序运行起来的样子了,那么这一过程发生了什么呢,来看下:

 

第一步:javac工具将.java文件编译成.class文件;

 

第二部:jvm将.class文件(.class文件中的内容都是字节码,字节码由opcode和操作数组成)加载到jvm内存中,并逐行运行其中的指令。这里的运行是解释运行的,需要通过解释器将字节码指令转换成机器码(汇编)并运行。

 

由于解释运行的效率不如直接运行机器码,那么jvm为什么不把字节码指令全部编译成机器码然后运行呢,也就是不需要jvm了,只需要一个把字节码编译成机器码的编译器即可。

 

但是把所有字节码都编译成机器码是很费时的,导致java程序启动很缓慢。

 

所以JIT支持三种情况:混合模式(Mixed Mode),解释模式(Interpreted Mode),编译模式(Compiled Mode)。

 

用户在运行java程序时可以通过参数自行选择,默认是混合模式。

 

解释模式:java -Xint 

 

编译模式:java -Xcomp

 

下面我们正式开始介绍编译部分:

 

Java中内置了两个即时编译器有两个:clientCompiler 和 serverCompiler,简称为C1和C2(也叫Opto编译器)。

 

clientCompiler 更注重编译的效率,追求快速完成编译,对代码进行简单、可靠的编译。优点:编译速度快;缺点:编译质量不如C2,因为只是基于代码的静态编译。C2是动态编译。(关于静态编译和动态编译的对比,可以参考《静态编译&动态编译》)

 

serverCompiler 更注重编译的质量,追求最大限度优化代码运行效率。会根据监控(Profiling)收集上来的信息进行优化。比如:热点代码检测。优点:编译质量高;缺点:编译速度慢。

 

为了达到一个平衡,JDK1.7开始就有了分层编译(Tiered Compilation),根据编译器编译、优化的规模与耗时,划分出不同的编译层次,包括:

 

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

 

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

 

第2层(或以上):也称为C2编译,将字节码编译成机器码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。

 

也可以更加详细的分为:

 

复制代码

第 0 层:程序解释执行,默认开启性能监控功能(Profiling),如果不开启,可触发第二层编译;

 

第 1 层:可称为 C1 编译,将字节码编译为本地代码,进行简单、可靠的优化,不开启 Profiling;

 

第 2 层:也称为 C1 编译,开启 Profiling,仅执行带方法调用次数和循环回边执行次数 profiling 的 C1 编译;

 

第 3 层:也称为 C1 编译,执行所有带 Profiling 的 C1 编译;

 

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

复制代码

 

 

这里提到了不可靠的优化,是的,不是所有的优化都提升程序的运行效率。有时候优化了还不如不优化,当编译器发现优化后的代码运行效率不如之前,或者出现“罕见陷阱(Uncommon Trap)”时,可以通过逆优化(Deoptimization)退回到优化前的状态继续执行。

 

要退回的那个状态就是“逃生门”,解释运行就是C1的逃生门,C1就是C2的逃生门。

 

Tips:编译动作是异步的,不会阻塞代码运行,如果一个方法在编译中,那么就会解释执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ -- 特殊类设计

目录 设计一个类,不能被拷贝 C98的做法 C11的做法 设计一个类,只能在堆上创建对象 实现方式1 实现方式2 设计一个类,只能在栈上创建对象 实现方式1 方式1的优化 实现方式2 设计一个类,不能被继承 设计模式 什么是设计…

正则表达式在java里的运用

文章目录 前言一、什么是正则表达式?二、使用步骤1.判断数字2.判断包含某个字符串 总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容…

计算机竞赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向&#xff0c…

Linux 安全 - Capabilities机制

文章目录 前言一、简介二、Capabilities list2.1 POSIX-draft defined capabilities2.2 Linux-specific capabilities 三、 Past and current implementation四、Thread capability sets五、File capabilities六、Transformation of capabilities during execve()七、Capabilit…

mmpretrain学习笔记

深度学习模型的训练涉及几个方面 1、模型结构:模型有几层、每层多少通道数等 2、数据:数据集划分、数据文件路径、批大小、数据增强策略等 3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等 4、运行时:GPU、…

【数据集】1985-2022年CLCD逐年土地利用分类数据

1985-2022年CLCD逐年土地利用分类数据 目前,CLCD 1985-2022年土地覆被数据集是较少的目前可公开获取的30m分辨率长时序逐年土地覆被数据。CLCD 反映了中国快速的城市化进程和一系列生态工程,揭示了气候变化条件下人为对土地覆盖的影响,其在全球变化研究中具有潜在应用价值。…

【多线程】线程安全的集合类

文章目录 1. 多线程环境使用ArrayList1.1 自己使用同步机制1.2 Collections.synchronizedList(new ArrayList);1.3 使用 CopyOnWriteArrayList 2. 多线程使用队列3. 多线程环境使用哈希表3.1 HashTable3.2 ConcurrentHashMap3.3 Hashtable和HashMap、ConcurrentHashMap 之间的区…

28 drf-Vue个人向总结-1

文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…

wallis匀色算法、直方图匹配、颜色转移方法比较

算法原理 这三种方法应该是比较基础的匀色处理算法 三个算法的原理比较简单,具体原理大家可以自己百度 (1)wallis匀色原理主要在于利用Wallis滤波器使原始图像的均值和标准差与参考影像相当,从而使原始影像和参考影像具有相近的色…

WebPack-打包工具

从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求. 下面举个例子 : main.js 我们只命名导出一个变量 export const name"老六"index.js import { name } from "./tset/…

第P7周—咖啡豆识别(1)

数据集及wen件目录介绍: 数据集:工作台 - Heywhale.com 一、前期工作 1.1 数据详情 import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os,…

聊聊KISS(Keep It Simple, Stupid)原则

文章目录 1. 前言2. KISS原则的几项描述3. KISS原则和奥卡姆剃刀原则区别 1. 前言 KISS原则,是Keep It Simple, Stupid的缩写,翻译成中文就是“保持简单,愚蠢的人也能懂”。这是一种鼓励简单设计的设计原则。 KISS原则的主要思想是&#x…

mysqlDM数据库中利用函数更新身份证字段,单表计算单表更新

#查询总数,男女的分别人数 SELECTcount( * ),sum( CASE WHEN gender 1 THEN 1 ELSE 0 END ) AS nan, sum( CASE WHEN gender 2 THEN 1 ELSE 0 END ) AS nv FROMt_user 写死版本的更新 #可以正确运行的sql,这样的话是写死版本 UPDATE t_user SET gender ( select sex fro…

python+pygame+opencv+gpt实现虚拟数字人直播(有趣的探索)

AI技术突飞猛进,不断的改变着人们的工作和生活。数字人直播作为新兴形式,必将成为未来趋势,具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作,提供更具个性化和多样化的互动体验,成为未来的一种趋…

Leetcode290. 单词规律

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 解题思路:哈希 力扣(LeetCode&…

数据结构:堆的简单介绍

目录 堆的介绍:(PriorityQueue) 大根堆:根节点比左右孩子节点大 小根堆:根节点比左右孩子节点小 堆的存储结构: 为什么二叉树在逻辑上用满二叉树结构,而不是普通二叉树呢? 因为如果是普通二叉树会造成资源的浪费​编辑 堆的介绍:(PriorityQueue) 堆又称优先级队列,何为优先…

3 OpenCV两张图片实现稀疏点云的生成

前文: 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…

C/C++跨平台构建工具CMake入门

文章目录 1.概述2.环境准备2.1 安装编译工具2.2 安装CMake 3.编译一个示例程序总结 1.概述 本人一直对OpenGL的3d渲染很感兴趣,但是苦于自己一直是Android开发,没有机会接触这方面的知识。就在最近吗,机会来了,以前一个做3D渲染的…

【C/C++】C/C++面试八股

C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的?构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么?为什么要内存对齐static关键…

微信公众号网页授权登录获取用户基本信息

概述 微信公众号网页授权登录后微信获取用户基本信息,部署即可运行完整demo 详细 一、前言 (1)适合人群 1,JAVA服务端开发人员 2,初级人员开发人员 3,了解spring springboot maven 3,了…