| |
|
开发:
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的半编译半解释体现在 java有两种解释器 字节码解析器与模板解析器 解释器就是把代码中的关键字翻译成机器码 比如new关键字在字节码解释器中它对应jvm中的一个switch分支这个分支中做的事情就是分配内存等操作 而java中一共有200多个关键字 这一段switch是很长的 它还会循环遍历代码中的关键字 所以它就会执行的很慢 然后就有了模板解释器 模板解释器可以理解为它创建了一个数组 数组的下标就对应一个函数指针 这个函数指针中的逻辑就是关键字的逻辑 并且这个逻辑直接就是硬编码 并对硬编码进行了编织 编织硬编码就是把代码中不需要的给删除只留着核心(称为执行流) 比如堆栈平衡的逻辑 在某些情况下堆栈平衡是不需要的 可以给删了 这样的操作就叫内存编织 内存编织 精细化的构造 避免内存浪费 内存消耗 < 原生的内存分配(jvm分配内存的方式) java的三种运行模式 纯字节码解释器模式:-Xint JIT 热点代码 JIT最小单位是代码块(只要写了大括号就是代码块)触发JIT之后会把代码及时翻译成硬编码放进一个缓存中 当再次调用时直接从缓存中执行 JIT触发条件 client 模式下代码块调用1500次触发JIT 64位系统没有client模式 如果代码之前触发了JIT后一段时间没有再多次调用那么它会掉热度 也就是从JIT缓存中删除 JIT的编译器 c1 client模式 c2 server模式 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了就可以平均分发并发量了 锁消除
一个局部变量的锁 这样的锁就很没意义 栈帧是线程私有的不存在线程安全问题 锁消除就是把这样的代码给优化成
优化成这样 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |