JVM系列(1)--编码到执行&ClassFileFormat

278 阅读2分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

java从编码到执行

jvm.jpg

  1. X.java文件经过了javac命令后生成了X.class文件
  2. X.class文件经过classLoader引入之后,又在java类库寻找需要的类
  3. 按需要给字节码解释器和JIT进行处理
  4. 最后由执行引擎执行

JDK和JVM是什么关系呢?

JVM与JDK的关系.jpg

  • JDK:英文全称 Java Development Kit,是Java的开发工具包 JDK是提供给Java开发人员使用的,其中包含了Java的开发工具JRE。其中的开发工具包括:编译工具(javac.exe)打包工具(jar.exe)等。通俗的说就是开发用的

  • JRE:英文全称 Java Runtime Environment,是Java运行环境 JRE包括Java虚拟机 (JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。通俗的说就是运行用的

  • JVM:英文全称 Java Virtual Machine,是java虚拟机。 它只认识.class为后缀的文件,它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。JVM是java能够跨平台的核心机制。通俗的说就是跨平台用的,就是把我们写的代码,转换成class文件用的。

    JDK JRE JVM的区别? JVM是java运行依赖的虚拟机系统。 在JDK基础上,还需要一些核心类库的支持,也就是JRE。 而在JRE基础上,又增添了一些针对开发人员使用的各种工具,就是JDK了。

    ClassFileFormat

    我们知道,一个java文件被编译后,会变成另一个class文件。

    那么编译完成后的class文件内部是什么样子的呢?

    以一下文件为例

    package jacquesh.jvm.study;
    
    public class Test001 {
    
    }
    
    

    当执行编译后

    package jacquesh.jvm.study;
    
    public class Test001 {
        public Test001() {
        }
    }
    
    

    可以看出编译后会自动生成一个无参构造方法,因为一个类在没有指定构造方法的时候,其实会自动生成一个无参构造。 但实际此时看到的class文件也还是代码形式。 但实际上,这是idea帮我们自己进行了反编译而已,真正的class文件肯定不是这样的。

    我们使用notepad++打开这个class文件

image-20200810102535042.png

可以看出class文件真实存在的其实是一堆16进制的编码