IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JIT即时编译器 -> 正文阅读

[Java知识库]JIT即时编译器

java是半编译半解释性语言

编译就是把代码编译成机器码
解释就是在代码运行的时候随着运行随着编译成机器码
机器码就是二进制

java的半编译半解释体现在
javac编译,java运行
还有运行期即时编译(c1或c2)+解释执行

java有两种解释器

字节码解析器与模板解析器

解释器就是把代码中的关键字翻译成机器码 比如new关键字在字节码解释器中它对应jvm中的一个switch分支这个分支中做的事情就是分配内存等操作 而java中一共有200多个关键字 这一段switch是很长的 它还会循环遍历代码中的关键字 所以它就会执行的很慢 然后就有了模板解释器 模板解释器可以理解为它创建了一个数组 数组的下标就对应一个函数指针 这个函数指针中的逻辑就是关键字的逻辑 并且这个逻辑直接就是硬编码 并对硬编码进行了编织 编织硬编码就是把代码中不需要的给删除只留着核心(称为执行流) 比如堆栈平衡的逻辑 在某些情况下堆栈平衡是不需要的 可以给删了 这样的操作就叫内存编织

内存编织 精细化的构造 避免内存浪费 内存消耗 < 原生的内存分配(jvm分配内存的方式)

java的三种运行模式

纯字节码解释器模式:-Xint
纯编译模式:-Xcomp
mixed=纯子节码+纯编译:-Xmixed
纯字节码 执行效率慢 狗都不用
纯编译 在编译的时候把代码全翻译成机器码 执行效率最高 但是项目很大的话编译会很慢
混合模式 jdk8默认 它既可以在编译的时候很快 也不会再运行中很慢 混合模式与纯编译模式相差大约100-170毫秒左右

JIT 热点代码

JIT最小单位是代码块(只要写了大括号就是代码块)触发JIT之后会把代码及时翻译成硬编码放进一个缓存中 当再次调用时直接从缓存中执行

JIT触发条件

client 模式下代码块调用1500次触发JIT 64位系统没有client模式
server模式下代码块调用1000次触发JIT 64位系统默认 无法更改 32位机器可以改

如果代码之前触发了JIT后一段时间没有再多次调用那么它会掉热度 也就是从JIT缓存中删除

JIT的编译器
c1、c2

c1 client模式
c1的触发条件简单 收集数据少 它会在很短的时间触发jit 但是优化策略很少生成的代码相比较c2会差

c2 server模式
c2收集数据很多 较长的时间才能触发JIT 但是优化好生成的代码执行效率高

c1与c2是java运行时的编译器 它做的事情是把热点代码翻译成机器码(编织之后的机器码或者说优化之后的机器码)封装到一个OpcodeCache中 它生成的代码是多个执行流合并到一起的 比如有两个new操作使用模板解释器要去数组中找两次才能执行完 而JIT编译的代码吧两个new操作执行写到一起这样就会比查找两次数据快直接按着顺序执行就是 OpcodeCache跟阻塞队列一样 有两个线程一个线程添加数据一个线程监听队列中是否有数据 如果有就执行逻辑 这个OpcodeCache缓存是存放在方法区元空间中

混合模式 c1+c2 混合模式又叫分层编译模式

这样前期刚运行的java程序会做少量的优化随着执行时间越来越长会触发c2的优化从而达到性能的顶峰jdk6开始的

热机切冷机

现在有三台机器 有1w并发每台3300左右 这时加入了一台机器分担并发 然后4台机器每台2800多并发 这样看是可以正常运行的 但是刚加入的机器挂了 原因就是JIT 之前的三台机器抗3300并发是触发了JIT才能抗下的 没触发JIT可能就只能抗住2500多 新加入机器并发2800 新机器还没触发JIT导致cpu飞升然后宕机 所以新加入机器的时候并发量要慢慢的给新机器分配上也就是对它热机 等触发JIT了就可以平均分发并发量了

锁消除
比如这样的代码

public void aaa(){
   synchronized(new Object()){
   		System.out.println("---")
   }
}

一个局部变量的锁 这样的锁就很没意义 栈帧是线程私有的不存在线程安全问题 锁消除就是把这样的代码给优化成

public void aaa(){
   		System.out.println("---")
}

优化成这样

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:14:58  更:2022-03-08 22:15:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:03:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码