【JVM】深入JIT优化机制

news2024/9/20 7:54:08

1.JIT优化技术

在将高级语言转化为计算机可识别的机器语言时,常用的两种方式是编译和解释。Java在编译过程中,首先将代码编译成字节码。但是,字节码并不能直接在机器上执行。因此,JVM中内置了解释器(Interpreter),它在运行时将字节码逐行翻译成机器码并执行。

然而,解释器的执行方式是一边翻译,一边执行,导致执行效率较低。为了提高效率,HotSpot JVM引入了JIT(Just-In-Time)编译技术。

有了JIT技术后,JVM仍然通过解释器进行初始执行。但当JVM发现某个方法或代码块被频繁执行时,它将其标记为“热点代码”(Hot Spot Code)。JIT随后将这些热点代码编译为机器码,并进行优化。优化后的机器码被缓存起来,以便下次直接使用,从而显著提升执行效率。

2.热点检测

上面我们说过,要想触发JIT,首先需要识别出热点代码。目前主要的热点代码识别方式是热点探测,有以下两种

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

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

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

    方法计数器。顾名思义,就是记录一个方法被调用次数的计数器

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

3.编译优化

逃逸分析

  1. 全局逃逸:对象超出了方法或线程的范围,比如被存储在静态字段作为方法的返回值
public class GlobalEscapeExample {
    private static object staticObject;
    
    public void globalEscape() {
        static object = new 0bject();// 这个对象赋值给静态字段,因此它是全局逃逸的
    }
    public static stringBuffer craetestringBuffer(string sl,string s2){
        StringBuffer sb =new stringBuffer();
        sb.append(s1);
        sb.append(s2);
        return sb;
    }
}

如我们新建的staticObject就是全局逃逸的。以及下面的方法中的sb对象,也是全局逃逸的。

  1. 参数逃逸: 对象被作为参数传递或被参数引用,但在方法调用期间不会全局逃逸。
public class ArgEscapeExample {
    public void methodA() {
        obiect localobject =new object();
		methodB(localobject);//localobject作为参数传递,但不会从methodB中逃逸
    }

    public void methodB(object param){
        //在这里使用param
    }
}

如传递到methodB中的param对象,就是发生了参数逃逸的。因为他从methodA中逃逸到了methodB中

  1. 无逃逸: 对象可以被标量替换,意味着它的内存分配可以从生成的代码中移除。
public static string createstringBuffer(string s1,string s2) {
    stringBuffer sb = new stringBuffer();
    sb.append(s1);
    sb.append(s2);
    return sb.tostring();
}

如上面的sb,就没有发生逃逸,因为这个对象本身没有作为参数传递,也没有被当做方法返回值,并没有赋值给静态变量。

在Java中,不同的逃逸状态影响JIT (即时编译器)的优化策略:

  1. 全局逃逸: 由于对象可能被多个线程访问,全局逃逸的对象一般不适合进行栈上分配或其他内存优化。但JIT可能会进行其他类型的优化,如方法内联循环优化

  2. 参数逃逸: 这种情况下,对象虽然作为参数传递,但不会被方法外部的代码使用。JIT可以对这些对象进行一些优化,例如锁消除

  3. 无逃逸: 这是最适合优化的情况。JIT可以采取多种优化措施,如在栈上分配内存,消除锁甚至完全消除对象分配 (标量替换)。这些优化可以显著提高性能,减少垃圾收集的压力。

方法内联

方法内联是Java中的一个优化技术,即时编译器JIT用它来提高程序的运行效率。在Java中,方法内联意味着将一个方法的代码直接插入到调用它的地方,从而避免了方法调用的开销。这种优化对于小型且频繁调用的方法特别有用。

锁消除

锁消除是 JIT 编译器在编译期间通过分析代码的同步块,判断是否存在锁竞争的可能性。如果某个锁在多线程环境下不存在竞争,那么它就可以在生成的机器码中消除这些锁操作,以减少不必要的开销。

栈上分配

栈上分配的好处:

  1. 减少GC压力:对象分配在栈上,当方法执行完毕后,栈上的内存会自动释放,不需要垃圾回收(GC)来管理,从而减少了GC的压力。
  2. 提高性能:栈上的内存分配和释放非常高效,因为它只是对栈指针进行简单的移动操作,而堆上的内存管理相对复杂,需要垃圾回收器的参与。

Java中的对象一定在堆上分配内存吗?

不一定,在HotSpot虚拟机中,存在JIT优化的机制,JIT优化中可能会进行逃逸分析,当经过逃逸分析发现某个对象不会逃逸出当前方法(即它只在方法内部使用),那么这个对象就不会被分配到堆上,而是进行栈上分配

标量替换

标量是指一个无法再分解成更小的数据的数据。Java中的原始数据类型就是标量。相对的,那些还可以分解的数据叫做聚合量,Java中的对象就是聚合量,因为他可以分解成其他聚合量和标量。

在JIT阶段,如果经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。这个过程就是标量替换

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

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

相关文章

汇编语言1 - 什么是汇编语言?

1. 什么是汇编语言? 1.1. 汇编语言的定义1.2. 汇编语言与机器语言 1.2.1. 相同点1.2.2. 不同点 2. 汇编语言的主要特点3. 汇编语言的基本组成4. 汇编器 4.1. 主要工作流程4.2. 常见的汇编器 4.2.1. NASM(Netwide Assembler)4.2.2. MASM&…

PPT免费图片素材网站分享

一、Pixabay 网址:https://pixabay.com/ 图片类型:高清、免费、商用 使用方法:找到想要的图片之后,右键复制之后粘贴到PPT即可使用。同时,点击下载可以找到不同尺寸的PPT素材 二、花瓣网 网址:https://…

B树和B+树的插入、删除

1. B树 1.1 B树的定义 树也称树,它是一颗多路平衡查找树。我们描述一颗树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,用字母表示阶数。当取时,就是我们常见的二叉搜索树。 一颗阶的树定义如下: 每…

“卖水人”的生意经,要比机器人厂商更懂机器人

技术公司的生存法则。 生态链中每个角色都有自己的生存法则。对于机器人产业链中的技术“卖水人”,它的核心生存法则除了要闷头搞技术,更重要的是要比机器人厂商更懂机器人,这不仅很大程度决定了自身的技术路线,更决定了能否切中…

labelme标注的图像分割json文件转图片格式

label标注的标签是json格式,会对选择的区域进行打点标记,所有的点围成不规则的多边形区域,中间的部分就是分割的区域 这里编写了python脚本,可以把json文件转为图片格式,这里是png格式 目标摆放如下 转化结果如下&…

论文精读1

Equivariant Pretrained Transformer for Unified Geometric Learning on Multi-Domain 3D Molecules 核心公式: 论文导图 创新在统一分子建模和块级去噪预训练。

vue3中 ref 和 reactive 的区别

相同:均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同:ref用于包装JavaScript基本类型的数据(如字符串、数字、布尔值等),而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…

医疗器械维修行业的惊人真相!

在医疗领域,医疗器械维修行业有着不为人知的惊人真相。 其一,维修人才极度稀缺。医疗器械的技术不断革新,复杂程度日益提高,然而专业维修人员的数量增长却远远跟不上。这导致一些设备故障无法及时修复,影响医疗服务的…

消费企业如何实现对经销商的动态管理?包括哪些维度?

在数字化浪潮席卷全球的当下时代,消费企业正站在转型升级的十字路口。在这种背景下,传统的经销管理模式已经不能满足市场对于效率、透明度和个性化的需求。当前经销渠道从增量市场竞争转入存量市场竞争,消费企业需通过加速数字化转型来快速提…

软件测试行业到底有没有前景和出路?2024辞职后涨薪5K+,凭什么?

前言 软件测试工程师的工作要求: 文档评审,用例评审,需求评审; 测试用例设计,自动化测试脚本开发,测试架构设计、写作测试文档(测试计划、测试方案、测试用例等); 执行…

七夕来临,看鲜花商家如何通过小魔推短视频矩阵引爆流量

相信不少朋友都知道,前两天“秋天里的第一杯奶茶”这个热点又刷爆了朋友圈,“秋天的第一杯蜜雪”只用了短短1天时间,视频就已经收获10万赞、16万转发获得了强势围观! 明天8月10日就是农历的七夕了,而鲜花行业的商家&a…

【javaWeb技术】·外卖点餐小程序(脚手架学习1·数据库)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀系统学javaWeb开发_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 【免费】项…

将PPT中的元素保存为高清图片

PPT制作流程图,思维导图或者演示图片非常方便,本文主要记录如何将一个在PPT中画好的图片导出为高清图片。 1.在ppt中设计图片 以我在PPT中画的图片为例,将所有元素选中,右键组合,成为一个整体 2.另存为增强型元文件 …

文件系统管理问题总结

文件系统的基本组成 1.什么是linux文件系统 Linux 最经典的⼀句话是:「⼀切皆⽂件」,不仅普通的⽂件和⽬录,就连块设备、管道、socket 等,也 都是统⼀交给⽂件系统管理的。 Linux ⽂件系统会为每个⽂件分配两个数据结构&#…

畅捷通基于Flink的实时数仓落地实践

摘要:本文整理自畅捷通总架构师、阿里云MVP专家郑芸老师在 Flink Forward Asia 2023 中闭门会上的分享。内容主要为以下四部分: 业务背景数仓建设具体案例未来展望 一、业务背景 畅捷通是用友旗下成员企业,一直持续专注于小微企业的数字化转…

七夕情人节有什么好物推荐?五款心动数码产品推荐。

转眼间,七夕情人节即将来临,这个浪漫的节日是表达爱意、传递心意的最佳时刻!为了让爱意不再迷茫,团团精心挑选了一份情人节约会好物清单。这些精选产品,我亲自试用,确信它们能触动心弦,传递深情…

html+css 实现hover 3D按钮特效

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…

《向量数据库指南》——To B大型知识系统的多租设计

To B大型知识系统的多租设计 这类场景中,租户数量一般比较少。比如企业内多个独立的业务团队或部门,如果他们都在提供不同的知识库服务,那么对于数据库中台团队,每一个这样的业务团队或部门都是一个租户。 在向量数据库层面,中台团队需要根据业务复杂度为每个租户分…

儿童餐椅 亚马逊美国站ASTM认证步骤

本政策适用的儿童餐椅 儿童餐椅是一种供三岁以下儿童使用的独立座椅。座椅表面超出地面 15 英寸以上,可提高儿童所坐高度,通常于儿童进食时使用。儿童餐椅可由塑料、木材或金属制成,通常配有软垫座。儿童餐椅有带托盘和不带托盘的款式&#…

口碑最好的洗地机排名?洗地机十大排名公开揭晓!

随着现在洗地机逐渐走入大众的眼睛,很多人已经开始寻找合适的洗地机,但是因为市面上的品牌太多了,宣传的噱头也比较多,因此很多人都比较迷糊,不知道应该选择怎样的洗地机!本文将公开揭晓洗地机领域的十大排…