当前位置: 首页 > news >正文

JVM知识总结(即时编译)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

即时编译

Java编译器经过解释执行,其执行速度必然会比直接执行可执行的二进制字节码慢很多。

  • 为了解决这种效率问题,引入了 JIT(Just In Time ,即时编译) 技术。

当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是热点代码:

  • JIT会把部分热点代码翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。

热点检测

目前主要的热点代码识别方式是热点探测,HotSpot虚拟机中采用的主要是基于计数器的热点探测。

  • 采用这种方法的虚拟机会为每个方法,甚至是代码块建立计数器,统计方法的执行次数。

  • 某个方法超过阀值就认为是热点方法,触发JIT编译。

编译优化

JIT在做了热点检测识别出热点代码后,除了会对其字节码进行缓存,还会对代码做各种优化。

  • 逃逸分析,锁消除,锁膨胀,方法内联等。

逃逸分析

当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。

有了逃逸分析,可以判断出一个方法中的变量是否有可能被其他线程所访问或者改变,基于这个特性,JIT做了一些优化:

  • 标量替换,栈上分配

通过逃逸分析,Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。

标量替换

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

栈上分配

经过逃逸分析技术发现这个对象并没有被外部引用且仅在当前线程使用,那么它就会将该对象分配在栈上。

锁消除

逃逸分析某些没有被外部方法或者其他线程引用的情况下,会将某些锁消除。

方法内联

对于可以内联的方法,直接复制到调用者代码中,减少方法调用次数和性能消耗。

http://www.lryc.cn/news/417916.html

相关文章:

  • 【网络】TCP协议——TCP连接相关、TCP连接状态相关、TCP数据传输与控制相关、TCP数据处理和异常、基于TCP应用层协议
  • 一起看看JavaAgent到底是干啥用的
  • k8s工作负载控制器--DaemonSet
  • 探索Python文档自动化的奥秘:MkDocs的神奇之旅
  • 树莓派边缘计算网关搭建:集成MQTT、SQLite与Flask的完整解决方案
  • 如何通过GD32 MCU内部ADC参考电压通道提高采样精度?
  • Centos安装OpenSearch
  • 【pkill pgrep】Centos/Linux pkill命令详细介绍
  • Java如何使用 HTTP 请求下载图片
  • ARM/Linux嵌入式面经(二十):地平线嵌入式开发
  • 无人机竞速赛
  • 【书生大模型实战营(暑假场)】入门任务二 Git 关卡
  • OSPF小实验
  • 蛋白质生物学:从序列到结构和疾病 下载并同时打开1LYZ和1H6M的PDB文件(提交图片)。描述这种蛋白质的二级和三级结构。(10分)
  • 用VBA在Word中随机打乱单词表,进行分列
  • UNI-APP_点击,长按,触摸,结束触摸事件
  • 【QT】Qt 音视频
  • CSP-J 复赛 模拟题6
  • 拷贝函数的三种调用方式
  • C语言 | Leetcode C语言题解之第327题区间和的个数
  • 统计学:条件概率模型
  • 前端工程师学习springboot2.x之配置idea热更新实现高效率开发节奏
  • 文本rerank与图像rerank
  • Docker 在 Windows 系统下的使用指南:数据卷和数据库
  • [数据集][目标检测]轴承缺陷划痕检测数据集VOC+YOLO格式1166张1类别
  • 将本地微服务发布到docker镜像二:
  • 前端构建工具|vite快速入门
  • 拯救PyCharm:击退IDE内存泄漏的策略
  • 在vue3的开发环境中为什么使用vite而不是用webpack
  • mybatis结合generator进行分页插件PluginAdapter开发