精通JVM,首先得知道class文件

前言

上篇文章:《精通JVM,不是从调优开始!!!

当你通过上文对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文件说明,可以参考官方文档:

docs.oracle.com/javase/spec...

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

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

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

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

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

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

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

源代码编译后的JVM指令集示例: docs.oracle.com/javase/spec...

指令的格式及其执行的操作 : docs.oracle.com/javase/spec...

指令操作码的助记符的映射 : docs.oracle.com/javase/spec...

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

关键因素:"翻译器"

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

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

解释器

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

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

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

即时编译器(JIT)

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

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

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

总结

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

相关推荐
Ljw...1 分钟前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
编程重生之路1 分钟前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱2 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
qq_17448285758 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
锅包肉的九珍9 小时前
Scala的Array数组
开发语言·后端·scala
心仪悦悦9 小时前
Scala的Array(2)
开发语言·后端·scala
2401_882727579 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
心仪悦悦9 小时前
Scala中的集合复习(1)
开发语言·后端·scala
代码小鑫10 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖10 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring