什么是 Java 字节码?采用字节码的好处是什么?

news/2024/11/15 1:29:02/

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

Java 程序从源代码到运行的过程如下图所示:

Java程序转变为机器代码的过程

我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT(just-in-time compilation) 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言

HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。

为什么不全部使用 AOT 呢?

AOT 可以提前编译节省启动时间,那为什么不全部使用这种编译方式呢?

长话短说,这和 Java 语言的动态特性有千丝万缕的联系了。举个例子,CGLIB 动态代理使用的是 ASM 技术,而这种技术大致原理是运行时直接在内存中生成并加载修改后的字节码文件也就是 .class 文件,如果全部使用 AOT 提前编译,也就不能使用 ASM 技术了。为了支持类似的动态特性,所以选择使用 JIT 即时编译器。


http://www.ppmy.cn/news/38740.html

相关文章

2_Linux高级存储管理

2_Linux高级存储管理1、逻辑卷1.1、lvm设备建立1.2、lvm拉伸1.3、lvm缩减1.4、缩减步骤1.5、lvm删除2、vdo(Virtual Data Optimize)1、逻辑卷 LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的存储卷&am…

4.1 读写不同数据源的数据

4.1 读写不同数据源的数据4.1.1 读写数据库数据1、数据库数据获取2、数据库数据存储4.1.2 读写文本文件1、文本文件读取2、文本文件存储4.1.3 读写Excel文件1、Excel文件读取2、Excel文件存储完整代码4.1.1 读写数据库数据 1、数据库数据获取 pandas提供了读取与存储关系型数…

SQL Server存储过程(数据库引擎)使用详解

存储过程(数据库引擎)一、背景知识1.1、使用存储过程的好处1.2、存储过程的类型二、创建存储过程三、修改存储过程四、删除存储过程五、执行存储过程5.1、建议5.2、使用 Transact-SQL执行存储过程六、授予对存储过程的权限6.1、授予对存储过程的权限6.2、…

ChatGPT 本地部署及搭建

这篇简要说下清华开源项目 ChatGLM 本地部署的详细教程。清华开源项目 ChatGLM-6B 已发布开源版本,这一项目可以直接部署在本地计算机上做测试,无需联网即可体验与 AI 聊天的乐趣。 项目地址:GitHub - THUDM/ChatGLM-6B: ChatGLM-6B&#xf…

代码随想录刷题-字符串-实现 strStr()

文章目录实现 strStr()习题暴力解法kmp 解法实现 strStr() 本节对应代码随想录中:代码随想录,讲解视频:帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili、帮你把KMP算法学个通透!&#xff0…

Cesium开发-vue3(vue-cli)

CesiumVue3cesium 获取 TOKENvue cli3 脚手架安装 cesiumcesium 获取 TOKEN 使用cesium需要申请一个token值, cesium申请token请点击这里 创建Token 然后就成功的获取到了一个 cesium 的秘钥 然后我们通过下面这句话就可以在项目里面添加一下秘钥,当…

SpringBoot 如何将配置文件挂到 jar 包外面?

目录一、SpringBoot 指定配置文件路径:1)使用命令行参数:2)使用环境变量:3)使用外部配置文件:二、SpringBoot 配置文件生效的优先级排序:一、SpringBoot 指定配置文件路径&#xff1…

腾讯云安装docker

卸载旧版本的 Docker 列出系统中已安装的docker包: yum list installed | grep docker卸载已安装的docker包: yum -y remove docker-ce-cli.x86_64 yum -y remove docker-ce.x86_64 yum -y remove containerd.io如果系统中没有 Docker,则直…