jvm学习笔记-字节码组成

jvm的功能

  1. 解释和运行:
    1. 对字节码文件中的指令,实时的解释成机器码,让计算机执行
  1. 内存管理:
    1. 自动为对象、方法等分配内存。
    2. 自动的垃圾回收机制,回收不再使用的对象。
  1. 即时编译:
    1. 对热点代码进行优化,提升执行效率。

java虚拟机的组成

jvm学习笔记-字节码组成_第1张图片

字节码文件的组成

应用场景
  • 解决工作中的实际问题-版本冲突
  • 解决工作中的实际问题-系统升级
主要内容
  • 基础信息:魔数、字节码文件对应的Java版本号,访问标识(public、final等等),父类和接口
  • 常量池:保存了字符串常量、类或接口名、字段名主要在字节码指令中使用。
  • 字段:当前类或接口声明的字段信息
  • 方法:当前类或接口声明的方法信息字节码指令
  • 类的属性:比如源码的文件名内部类的列表

基本信息
magic魔数

magic魔数,文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。

软件会使用文件的头几个文件去校验文件的类型,如果软件不支持该种类型就会出错。

文件类型

字节数

文件头

jpeg

3

FFD8FF

PNG

4

89504E47

bmp

2

424D

xml

5

3C3F786D6C

avi

4

41564920

java

4

CAFEBABE

主副版本号

主版本号用来标识大版本号,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升级一个大版本就加一,副版本号是当主版本号相同时作为区分不同版本的标识,一般只需要关心主版本号,1.2之后大版本号计算方式就是主版本号-44版本号的作用主要是判断当前字节码的版本和运行时的jdk是否兼容。

运行代码过程中主副版本号不兼容导致的错误的解决方案

  • 升级JDK版本。(容易引发其他的兼容性问,并且需要大量测试)
  • 将第三方依赖的版本号降低或者更换依赖,以满足JDK版本的要求。(建议采用)

常量池
作用

避免相同的内容重复定义,节省空间

  • 常量池中的数据都有一个编号,编号从1开始。在字段或字节码指令中通过编号可以快速的找到对应的数据。
  • 字节码指令中通过编号引用到常量池的过程称之为符号引用。

方法

字节码的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法区中的Code属性中。

//演示代码
public class Demo1 {
    public static void main(String[] args) {
        int i = 0;
        i = i++;
        System.out.println(i);
    }
}

转换成在字节码后再jclasslibview中查看,如下图所示

jvm学习笔记-字节码组成_第2张图片

字节码常见指令

java中操作数据是基于栈的设计模式,具体实现就是将数据存放在栈中,在需要使用的时候将栈顶的数据出栈,并执行相应的操作。

举例来说,在JVM中 执行 a = b + c 的字节码执行过程中操作数栈以及局部变量表的变化如下图所示。

局部变量表中存储着a、b、c 三个局部变量,首先将b和c分别入栈

jvm学习笔记-字节码组成_第3张图片

将栈顶的两个数出栈执行加法操作,并将结果保存至栈顶,之后将栈顶的数出栈赋值给a

jvm学习笔记-字节码组成_第4张图片

字节码文件常见工具的使用
javap -v命令
  • javap是jdk自带的反编译工具,可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件的内容。
  • 直接输入javap查看所有参数。
  • 输入javap -v字节码名称查看具体的字节码信息(如果jar包)需要先使用jar -xvf命令解压。

jclasslib插件
  • jclasslib的idea插件版本,建议开发时使用idea插件版本,可以在代码编译后实时看到字节码文件内容。

idea中使用jclasslib插件的方法

Arthas
  • Arthas是一款线上诊断产品,通过全局视角实时查看应用load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,大大提升线上问题排查效率

jvm学习笔记-字节码组成_第5张图片

下载地址

Arthas下载地址

帮助文档

Arthas帮助文档

你可能感兴趣的:(jvm,学习,笔记)