首页 > 编程语言 >【Java】JVM字节码分析

【Java】JVM字节码分析

时间:2024-06-05 18:55:32浏览次数:29  
标签:操作数 Java 字节 局部变量 栈顶 public JVM class

一、功能

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,字节,局部变量,栈顶,public,JVM,class
From: https://www.cnblogs.com/changwan/p/18233599

相关文章

  • eladmin-mp 低代码生成后台页面和服务端java代码接口调研
    概述总体这个项目前端使用vue2,后端使用springbootgit地址https://github.com/elunez/eladmin-mp预览地址https://eladmin.vip/demo/#/sys-tools/generator数据表配置低代码下载生成后的前端代码示例生成的后端代码示例:这里可以配置生成自动放在项目的目录......
  • Java转UML类图实现方法
    一、maven依赖<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-core</artifactId><version>3.26.0</version></dependency>二、解析Java文件类关系importcom.github.javaparser.Java......
  • Java开发必备软件工具
            Java开发工程师在进行后端开发项目时,可能会使用到一系列的软件和工具,以完成从编码、构建、测试到部署的整个流程。以下是一些常见的软件和工具列表:开发工具包(JDK)OracleJDK/OpenJDK:提供Java运行环境和编译工具。集成开发环境(IDE)IntelliJIDEA:......
  • Java线程池分类简单列举
    一、Java四种线程池Java通过Executors提供四种线程池,分别为newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出......
  • 线程池的拒绝策略(Java)
    java线程池的拒绝策略Java中的线程池拒绝策略定义了当任务无法执行时如何处理这些任务。以下是Java中常见的拒绝策略:一、CallerRunsPolicy#:当任务被拒绝添加时,如果调用者所在的线程不是线程池中的线程,那么任务将由该调用者所在的线程直接执行。ExecutorServiceexecutor......
  • JVM面试篇(下)
    垃圾收集器简述Java垃圾回收机制在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们......
  • Java环境配置(超详细)
    Java环境配置(超详细)引言1、安装JDK1.1、下载安装JDK1.2、配置环境变量:JAVA_HOME1.3、将JAVA_HOME添加到Path中2、安装Maven2.1、下载安装Maven2.2、配置maven的环境变量:M2_HOME2.3、将Maven变量添加到Path中引言Java开发环境的配置主要是安装JDK和Maven。1、......
  • Java1.8语言+ springboot +mysql + Thymeleaf 全套家政上门服务平台app小程序源码
    Java1.8语言+springboot+mysql +Thymeleaf 全套家政上门服务平台app小程序源码家政系统是一套可以提供上门家政、上门维修、上门洗车、上门搬家等服务为一体的家政平台解决方案。它能够与微信对接、拥有用户端小程序,并提供师傅端app,可以帮助创业者在不需要相关技术人员及......
  • JavaScript-匿名函数
    原文链接:https://blog.csdn.net/weixin_45203607/article/details/124227504什么是匿名函数1、匿名函数,即没有名称的函数2、如果单独只写一个匿名函数,此时是不符合语法要求的会报错。需要给匿名函数包裹一个括号,使之成为表达式。3、被小括号包裹的内容会被js识别为一个函数表......
  • 每天坚持写java锻炼能力---第一天(6.4)
    今天的目标是菜单:B站/马士兵的项目菜单packagejava1;importjava.util.Scanner;publicclassTest{publicstaticvoidmain(String[]args){while(true){//3.加入死循环,让输入一直有System.out.println();System.out.print......