JVM调优(一)入门及Class文件格式

一、JVM基础(Java Virtual Machine)

 1. java编码到执行:


  执行次数多的部分会被JIT即时编译。
JVM调优(一)入门及Class文件格式_第1张图片
  JVM虚拟机帮助屏蔽了不同操作系统的底层,实现了跨语言的平台,java跟jvm无关。
  跨语言:只要能产生class文件,就能被JVM所应用。
JVM调优(一)入门及Class文件格式_第2张图片
  jvm是一种规范。
  官方文档:
    https://docs.oracle.com/en/java/javase/13/ 中Specifications-language And Virtual
JVM调优(一)入门及Class文件格式_第3张图片
    https://docs.oracle.com/javase/specs/index.html.

 2. 常见JVM实现

  目前用的最多的Hotspot(java虚拟机)

 3. JDK JRE JVM关系

  包含关系,不是独立的关系
JVM调优(一)入门及Class文件格式_第4张图片

二、Class File Format

 1. 如果类不加构造方法,编译时会自动加入一个无参构造方法
 2. class文件是一个二进制字节流
 3. 查看16进制文件:notepad++或idea的binEd插件

  格式分为u1 u2 u4 u8 意思就是一个字节一组,两个字节一组…
  用十六进制打开一个文件时前面的头基本都一样:
JVM调优(一)入门及Class文件格式_第5张图片
  class十六进制文件结构解析:
    ①CA FE BA BE开头的四个字节代表JAVA编译完的文件,这一部分叫magic number,
    ②后面四个字节中前两位是minor version,后两位是marjor version,minor代表小版本,marjor是大版本(比如6.45,marjor是6,minor是0.45)
    ③后面两个字节是常量池(极其复杂的部分,最大2的16次方=65535),constant_pool_count,是一个constant_pool_count - 1个的表,常量池编号从1开始,平时的数组是0开始,所以需要-1(0是代表这个常量池没有任何对象指向),比如上图中代表常量池目前是15(10从16进制转换为十进制然后-1)。
    ④access_flags,前面的关键字,比如说public abstract enum …
    ⑤this_class,当前的对象指向常量池
    ⑥super_class,父类指向常量池
    ⑦interfaces_count,实现了多少个接口
    ⑧fields count,多少个属性
    ⑨methods count,多少个方法
    ⑩attributes count,多少个其他的附加属性
  上述内容看起来比较费劲,可以使用java自带的javap -v命令,命令行中可以查看class文件的各种结构
  也可以使用idea的jClasslib插件(常用):
    手动编译class文件,光标放入class文件大括号内,view - show byteCode with jclasslib
JVM调优(一)入门及Class文件格式_第6张图片
  图中access flags :0x0021代表包含一个public关键字和super(这里的super是不会显示的,所有的类都有所以不用管,是历史遗留问题),如果包含多个关键字,那这个值就是每个关键字自己的位之间相互做与运算,比如上图就是public和super与运算(0x0001 与 0x0020)
JVM调优(一)入门及Class文件格式_第7张图片
  在这里插入图片描述代表在常量池中的3号存的这个对象

 4. 常量池

  ①类型
    nameAndType:JVM调优(一)入门及Class文件格式_第8张图片,图中init代表构造方法,()代表无参,v代表没有返回值,这是一个类中的无参无返回值默认构造方法,如果括号内有参数 比如显示的 ([IIJ)J ,代表第一个参数是int数组([代表数组,I代表int),第二个是int,第三个是long类型(J),返回值是最后一个J 也就是long类型。
JVM调优(一)入门及Class文件格式_第9张图片
  方法的code字节属性是这个方法的具体实现(比如先把对象放入栈然后调用构造方法return…)

你可能感兴趣的:(JVM调优)