JVM 字节码初识

287 阅读2分钟

前言

Java的跨平台

  • Java的跨平台是因为它有JVM,以及Java代码会被编译成.class文件,即字节码文件。
  • 字节码文件在不同平台都可以通过JVM去执行它。
  • 值得一提的是,JVM并不是跨平台的,不同的平台有它不同的实现特点。
  • JVM可以看得懂字节码文件,但人是看不懂的,因为它是二进制文件。
  • 但是,JVM有规定字节码文件的规范,根据这个规范,其它语言只要能编译成JVM所规范的字节码文件,它就可以在JVM上运行。比如,Kotlin、Scala。。。
  • 之所以要学习它的字节码,是为了更好的理解Java代码的更深层次的意义,以及代码运行的机制,比如加深和理解Volatile关键字中的防止指令重排序、内存可见性的原因等等。

初识字节码文件

首先.class是字节码文件

  • .class文件并不是大伙儿用IDEA打开的那样,那其实是IDEA反编译的。
  • Java代码都要编译成.class文件,JVM才能运行它。

.class内容

  • 先来一段Java代码,编译一下。
    public class StartByteCode {
      private int anInt;
    
      public int getAnInt() {
          return anInt;
      }
    
      public void setAnInt(int anInt) {
          this.anInt = anInt;
      }
    }
    
  • 其字节码,如下: image.png

之所以叫字节码,是因为它是以两个16进制数为单位,一个16进制由4位二进制表示,因为二进制1111表示f,两个16进制数用8位表示,即一个字节。

  • 上面的字节码右侧有些前面写的java代码,那是插件根据ACII码勉为其难的翻译出来的,但是并不是所有的字节都ACII码对应,所以就显得很乱。
  • 再看开头的前4个字节,称之为魔数(Magic Number),是来标识这个是一个合法且有效的字节码文件。,如果不是CA FE BA BE,JVM就不会读取并执行它。

其实Java自带反编译的命令

  • javap -verbose xxx.class

    • 使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中的方法信息、类变量与成员变量等信息
    • 魔数︰所有的.class字节码文件的前4个字节都是魔数,魔数值为固定值: 0xCAFEBABE

    image.png

解读一下字节码

  • 上面提到,前4个字节是魔数。
  • 。。。
  • 下一篇