【Java】JVM字节码分析

java,jvm · 浏览次数 : 0

小编点评

一、功能 1. 工作原理:JVM负责运行Java字节码文件,将其转换为机器码并执行。 2. 内存管理:自动分配和回收内存,实现垃圾回收机制。 3. 即时编译:通过即时编译器(JIT),在需要时将字节码转换为机器码并保存在内存中,以提高执行效率。 二、解释字节码 1. 使用工具jclasslib工具查看class字节码。 2. 分析class文件:以HelloWorld为例,其字节码文件头文件为CAFEBABE1。 3. public class HelloWorld { public static void main(String[] args) { int i = 0; int j = i+1; System.out.println(j); } } 对应的.class字节文件为: 0 iconst_0 #将常量0放入操作数栈中 1 istore_1 #将操作数栈顶的数值存储到局部变量表1的位置 2 iload_1 #将局部变量表1中的数复制到栈上 3 iconst_1 #将常量1放入操作数栈中 4 iadd #将栈中最上面两个值进行相加,存储到栈顶 5 istore_2 #从栈中取出操作数放入局部变量表中2号位置 13 return #方法结束 三、分析i++ 1. public class HelloWorld { public static void main(String[] args) { int i = 0; i = i++; System.out.println(i); } } 对应的.class字节文件为: 0 iconst_0 #将常量0放入操作数栈 1 istore_1 #将栈顶元素取出存储到局部变量表1的位置 2 iload_1 #将局部变量表1位置的操作数复制到操作栈 3 iinc 1 by 1 #将布局变量表1的位置的值加1 6 istore_1 #将栈顶元素取出存储到局部变量表1的位置 10 iload_1 #将布局变量表1位置的操作数复制到操作数栈 14 return结果输出为0 四、分析++ 1. public class HelloWorld { public static void main(String[] args) { int i = 0; i = ++i; System.out.println(i); } } 对应的.class字节文件为: 0 iconst_0 #将常量0放入操作数栈 1 istore_1 #将栈顶元素取出存储到局部变量表1的位置 2 iinc 1 by 1 #将布局变量表1的位置的值加1 5 iload_1 #将布局变量表1位置的操作数复制到操作数栈 6 istore_1 #将栈顶元素取出存储到局部变量表1的位置 10 iload_1 #将布局变量表1位置的操作数复制到操作数栈 14 return输出结果为1 } 归纳总结: - JVM负责运行Java字节码文件,并将其转换为机器码。 - 内存管理:自动分配和回收内存,包括自动垃圾回收机制。 - 即时编译器(JIT):通过即时编译技术,提高字节码的执行效率。 - 类文件结构:头部信息包含文件类型、版本号等信息,以及方法字节码等内容。 - 代码优化:JVM会识别热点代码,并将其编译成本地机器码以提高执行速度。

正文

一、功能

1、工作原理

whiteboard_exported_image (1).png

2、解释和运行

jvm本质上是运行在计算机上的程序,负责运行java字节码文件

对字节码文件中的指令,实时的解释成机器码,供计算机执行

3、内存管理

自动为对象、方法等分配内存

自动垃圾回收机制,回收不再使用的对象

4、 即时编译

在java中每次执行都需要实时解释字节码文件成机器码,导致效率较低、速度变慢。这么做的原因是因为需要跨平台,不同操作系统的java虚拟机不同,解释编译的也不一样,不同的虚拟机会转成当前操作系统的字节码。

即时编译就是为了解决这个性能问题。JVM会识别热点代码(短时间多次调用), 会主动优化并且解释成机器码 ,将这个机器码保存在内存中。下次如果调用这段热点代码会直接从内存中取出调用。这样就省略了一次解释的步骤。这样在某些情况下性能就会提升很大

二、解释字节码

使用工具jclasslib工具查看class字节码

class字节文件的头文件的前四个字节是检验文件类型用的,class字节文件的头文件为CAFEBABE

1、分析class文件

public class HelloWorld {
    public static void main(String[] args) {
        int i = 0 ;
        int j = i+1;
        System.out.println(j);
    }
}

对应的.class字节文件为

 0 iconst_0    #将常量0放入操作数栈中
 1 istore_1    #将操作数栈顶的数值存储到局部变量表1的位置
 2 iload_1     #将局部变量表1中的数复制到栈上
 3 iconst_1    #将常量1放入操作数栈中栈中
 4 iadd        #将栈中最上面两个值进行相加,存储到栈顶
 5 istore_2    #从栈中取出操作数放入局部变量表中2号位置
13 return      #方法结束

whiteboard_exported_image.png

2、分析i++

public class HelloWorld {
    public static void main(String[] args) {
        int i = 0 ;
        i = i++; 
        System.out.println(i);
    }
}
 0 iconst_0       #将常量0放入操作数栈
 1 istore_1       #将栈顶元素取出存储到局部变量表1的位置
 2 iload_1        #将局部变量表1位置的操作数复制到操作栈
 3 iinc 1 by 1    #将布局变量表1的位置的值加1
 6 istore_1       #将栈顶元素取出存储到局部变量表1的位置
10 iload_1        #将布局变量表1位置的操作数复制到操作数栈
14 return

结果输出为0

3、分析++i

public class HelloWorld {
    public static void main(String[] args) {
        int i = 0 ;
        i = ++i; 
        System.out.println(i);
    }
}
 0 iconst_0       #将常量0放入操作数栈
 1 istore_1       #将栈顶元素取出存储到局部变量表1的位置
 2 iinc 1 by 1    #将布局变量表1的位置的值加1
 5 iload_1        #将布局变量表1位置的操作数复制到操作数栈
 6 istore_1       #将栈顶元素取出存储到局部变量表1的位置
10 iload_1        #将布局变量表1位置的操作数复制到操作数栈
14 return

输出结果为1

与【Java】JVM字节码分析相似的内容:

【Java】JVM字节码分析

Java 字节码是Java源代码编译生成的中间形式,赋予Java跨平台特性,通过对字节码的分析,可以迅速找到代码的性能瓶颈。

[转帖]【JVM】类文件结构

Class文件的定义 一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序。 注:Java虚拟机规范规定,Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:

[转帖]【JVM】字节码执行引擎

引入 class文件就是字节码文件,是由虚拟机执行的文件。也就是java语言和C & C++语言的区别就是,整个编译执行过程多了一个虚拟机这一步。这个在 类文件结构 中已经解释。上一节讲了虚拟机是如何加载一个class的,这一节就讲解虚拟机是如何执行class文件的。 运行时栈帧结构 1.定义 栈是

什么是 Java 字节码?采用字节码的好处是什么?

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过

[转帖]【JVM】Java内存区域与OOM

引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有) 作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节

[转帖]【JVM】Java内存区域与OOM

引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有) 作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节

[转帖]【JVM】JVM概述

1.JVM定义 JVM 是Java Virtual Machine(JVM )的缩写,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令进行执行,这样实现了Java“一次编译,到处运行”。 2.JVM组成 JVM由三大部分组成:类加载器(ClassLoader subsystem),执

字节码文件解剖

#### 前提提要: .java文件通过java -c 生成.class文件,这部分并非是JVM需要处理的部分,JVM处理的部分是基于生成的class文件,生成的部分是由编译器来负责 一个字节码文件的主要组成部分 使用工具说明 idea的JclassLib插件 使用步骤: 运行代码(只要你更新了代码

[转帖]java中方法不要写太长的真正原因

https://www.iteye.com/blog/enetor-976070 java中一般建议一个方法不要写的过长,不方便维护和阅读是其中的一个原因,但是其真正性能的原因大家知道吗? 我们知道,JVM一开始是以解释方式执行字节码的。当这段代码被执行的次数足够多以后,它会被动态优化并编译成机器码

万字详解JVM,让你一文吃透

摘要:本文将带大家详细地了解关于JVM的一些知识点。 本文分享自华为云社区《【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列》,作者: 冰 河 。 JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境。 Java 程序设计语言 Java 虚拟机 Java API类库 J