Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JVM实现跨平台的关键因素:class文件和“翻译器”

JVM实现跨平台的关键因素:class文件和“翻译器”

原创
作者头像
王二蛋
发布于 2024-09-12 13:07:48
发布于 2024-09-12 13:07:48
2880
举报

前言

当你通过上文对JVM有了初步的认识后,就需要关心JVM里面的内容了。

通过上文可以知道,JVM是Java实现跨平台特性的关键所在,并且支持近百种编程语言。JVM是如何做到这两点的?本文将对此进行说明。

关键因素:class文件

JVM可以实现跨平台并且支持近百种编程语言运行,最关键的因素就是.class。

  • 将class文件交给JVM,就不用考虑跨平台的问题了。
  • 任何编程语言只要编译成.class,都可以运行在JVM上。

可见class文件的重要性,所以,如果想要精通JVM,首先要了解class。

class文件格式说明

一个class文件格式是这样的

文件中定义了这个类的元数据和编译后的JVM指令。作用如下:

  • 在加载类文件时,这些元数据会被JVM校验和解析。
  • 编译后的JVM指令,最终会通过解释器或者即时编译转换成机器的本地指令。

这两点下面会重点说明。

Java 源代码在class文件中的体现

为了直观地理解class文件,下面通过一个示例展示源代码在class中的体现。

对上图内容做一个简单的解释说明:

  1. 图中的magic,硬编码为0xCAFEBABE,标识该文件是一个有效的Java类文件,在类加载时会对此进行校验
  2. 图中的constant_pool,是一些符号引用,在对该类解析时会转换为直接引用
  3. 图中的methods_count,是指该类有几个方法,methods[]则是每个方法的具体信息,这些信息中就包括具体的attributes,比如Code,即JVM指令。 fields_countfields[]interfaces_countinterfaces[] 同理。

更详细的class文件说明,可以参考官方文档

涉及到的知识点(面试题)

前两点涉及到JVM一个重要的知识点:类加载机制。在面试时经常会被问到相关知识,比如什么是类加载机制?有哪些类加载器?什么是双亲委派机制?感兴趣的可以移步至《Java面试中经常被问到的15道JVM面试题》,有具体的说明。

这里简单说明下符号引用和直接引用。

什么是符号引用和直接引用?

符号引用就是上图constant_pool中的 #1 = Methodref #7 之类的内容,用来说明对象的引用(变量)和对象之间的关系,是一个静态的表示。

当程序运行时,对象是要加载到内存中的。所以,JVM运行时,会把对象的引用解析到实际的内存地址,也就是直接引用。

第三点中的JVM指令,如果想要了解的,可以移步至官方文档:

源代码编译后的JVM指令集示例

指令的格式及其执行的操作

指令操作码的助记符的映射

class文件通过类加载机制,最终会被加载到内存中,这块内存会被JVM管理,也就是运行时数据区。同样,感兴趣的可以移步至《Java面试中经常被问到的15道JVM面试题》,有具体的说明。

关键因素:“翻译器”

JVM可以实现跨平台另一个关键因素就是“翻译器”:将字节码转化为机器指令。

在JVM中有两个“翻译器”,一个解释器,一个即时编译器

解释器

JVM运行时,解释器会逐条读取字节码指令,然后将其“翻译”为本地指令并执行。

例如,JVM的new指令,可能会涉及到系统调用、内存读写指令等操作,大概这样。

在这里插入图片描述
在这里插入图片描述

由于每次执行字节码时都需要逐条翻译,所以,解释器这种方式执行效率比较慢。

即时编译器(JIT)

为了解决这一问题,JVM还提供了即时编译器(JIT)的方式。它的工作原理是这样的:

将“热点代码”直接翻译成本地机器码并缓存,在后续执行相同的代码段时,就可以直接使用缓存的本地机器码,避免了重复的解释过程,从而提高了执行效率。

注:JVM运行时,两者是同时存在的。

总结

如果想要精通JVM,对class文件的了解是必不可少的。因为class文件会涉及到类加载、类文件在JVM内存中的布局等知识。除此之外,在了解JVM指令和“翻译器”后,可以让你更清晰的认识Java编程语言从编码到运行的过程。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
3分钟速读原著《深入理解Java虚拟机》(一)
一.Java的体系结构 1.JVM加载字节码 1.1 JVM都是会通过类加载器加载字节码,不同的JVM虚拟机,执行引擎会有所不同, ①一次性解释字节码 ②即时编译器(just-in-time-compiler),这种情况下第一次被执行的字节码会被编译称为本地机器代码,编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用 ③引擎自适应优化器,在这种方法里,虚拟机会监视运行中程序的活动,并且记录下使用最频繁的代码段,在程序运行的过程中,它只会选择性的把那些最常用的字节码代码转换成本地的机器代码 ④备
cwl_java
2019/10/26
3720
Class的生命周期
java 文件通过javac编译成class文件,这种代码我们称之为字节码(中间码), 由JVM去加载字节码这个过程。
向着百万年薪努力的小赵
2022/12/02
2680
Class的生命周期
【JVM】关于JVM,你需要掌握这些!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
4050
【JVM】关于JVM,你需要掌握这些!!
JVM是如何执行Java程序的(串联JVM面试题)
如果你对JVM一知半解,如果你想了解JVM的工作流程,如果你知道一些JVM面试题却无法将知识点串联起来,那么这篇文章非常适合你。
王二蛋
2024/09/19
1820
Java跨平台你真的理解对了吗?
小面朋友最近去面试,直接被一个基础问题pass了。面试管的问题是:你怎么看待Java是跨平台的说法?
灬沙师弟
2023/03/07
3740
Java跨平台你真的理解对了吗?
JVM快速扫盲篇
HotSpot是Java体系下使用最多的虚拟机,它结合了最新的内存模型,垃圾收集器和自适应优化器,为使用许多先进技术的Java应用程序提供了最佳性能。
程序员波特
2024/01/19
1360
JVM快速扫盲篇
深入理解Java类加载机制,再也不用死记硬背了
在《说透分布式事务》中,我举例里说明了会与会的差别。对一门语言的学习,这里谈谈我理解的“会”的三个层次:
静儿
2022/05/06
3740
深入理解Java类加载机制,再也不用死记硬背了
jvm入门
java字节码:java语言编译成的字节码,.class文件,jvm与java语言无必然联系,只与特定的二进制文件-class文件格式关联。class文件包含了jvm指令集(或称字节码)和符号表,其他辅助信息
用户10832809
2025/02/23
1210
【面试题精讲】JVM-类的生命周期
Java 虚拟机(JVM) 是运行所有 Java 程序的抽象计算机。一个 Java 程序运行在 JVM 中,可以使用 Java 编程语言编写的应用软件以及工具进行解读和执行。
程序员朱永胜
2023/10/26
1680
【面试题精讲】JVM-类的生命周期
初探JVM,只需要这篇文章!
www.oracle.com -> 右下角Product Documentation -> 往下拉选择Java -> Java SE documentation-> Previous releases -> JDK 8 -> 此时定位到:https://docs.oracle.com/javas...
Java架构
2019/09/29
3810
初探JVM,只需要这篇文章!
重磅发行!腾讯爆出的“JVM学习笔记”,看完我爱了
“JVM”,一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。有了JVM后,Java语言在不同平台上运行时不需要重新编译,为我们提供了极大的便利性,现在在面试当中“JVM”相关的知识是必问的,可见现在互联网企业对JVM的重视性。
用户5546570
2020/12/25
6250
JVM 为什么需要类加载机制?深入浅出 JVM 类加载原理
在 Java 中,类加载机制是 Java 虚拟机(JVM)将 .class 文件加载到内存并转化为可以运行的 Class 对象的过程。简单来说,类加载机制是让“代码变为现实”的第一步!
码哥字节
2024/12/05
1270
JVM 为什么需要类加载机制?深入浅出 JVM 类加载原理
【JVM】——JVM运行机制、类加载机制、内存划分
在计算机导论中,我们把编程语言可以分为:编译型语言和解释型语言(虽然现在不适用了)
三三是该溜子
2024/12/30
1000
【JVM】——JVM运行机制、类加载机制、内存划分
Java程序员必备基础:Java代码是怎么运行的?
作为一名Java程序员,我们需要知道Java代码是怎么运行的。最近复习了深入理解Java虚拟机,做了一下总结,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激不尽。
好好学java
2020/03/24
1.2K0
Java程序员必备基础:Java代码是怎么运行的?
JVM到底该学些什么
学Java的第一天我们就知道Java是一种跨平台的语言,虽然当时可能是懵懵懂懂,但是「一次编译,到处运行」的特性想必是给众多Javaer留下了不可磨灭的印象。
蝉沐风
2022/08/22
2650
JVM到底该学些什么
<循环渐进JVM> jvm总览-让我们从头开始,带官网解释
Reference -> Developer Guides -> 定位到:https://docs.oracle.com/javase/8/docs/index.html
源码之路
2020/12/22
4560
<循环渐进JVM> jvm总览-让我们从头开始,带官网解释
JVM《六 Class 文件的解析》
上一篇说的是类加载机制,其中刚开始装载阶段是对二进制流进行装载或者解析对应的 .class 文件。
邹志全
2020/02/25
4990
JVM《六 Class 文件的解析》
深入理解Java内存区域(最新版面试题)
如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻
小熊学Java
2023/07/16
3230
深入理解Java内存区域(最新版面试题)
JVM 面试基础准备篇(一)
我们把CPU能够直接认识的数据指令,称为机器语言,也就是010101001这种形式
架构探险之道
2023/03/04
2410
JVM 面试基础准备篇(一)
JVM 学习笔记(一)
JRE是Java Runtime Environment的缩写,是Java程序的运行环境。是可以在其上运行、测试和传输应用程序的Java平台。它包括Java虚拟机(jvm)、Java核心类库和支持文件。
会说话的丶猫
2020/08/06
4910
JVM 学习笔记(一)
相关推荐
3分钟速读原著《深入理解Java虚拟机》(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档