一、功能

1、工作原理

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 #方法结束

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字节码分析的更多相关文章

  1. Java finally语句到底是在return之前还是之后执行(JVM字节码分析及内部体系结构)?

    之前看了一篇关于"Java finally语句到底是在return之前还是之后执行?"这样的博客,看到兴致处,突然博客里的一个测试用例让我产生了疑惑. 测试用例如下: public ...

  2. java jvm 字节码 实例

    https://blog.csdn.net/wuzhiwei549/article/details/80626677 代码 package strings; //: strings/WhitherSt ...

  3. JVM 字节码执行实例分析

    前言 最近在看<Java 虚拟机规范>和<深入理解JVM虚拟机>,对于字节码的执行有了进一步的了解.字节码就像是汇编语言,是 JVM 的指令集.下面我们先对 JVM 执行引擎做 ...

  4. Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)

    前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...

  5. Java字节码分析

    目录 Java字节码分析 查看字节码详细内容 javap 实例分析 Java字节码分析 对于源码的效率,但从源码来看有时无法分析出准确的结果,因为不同的编译器版本可能会将相同的源码编译成不同的字节码, ...

  6. JVM 字节码指令手册 - 查看 Java 字节码

    JVM 字节码指令手册 - 查看 Java 字节码 jdk 进行的编译生成的 .class 是 16 进制数据文件,不利于学习分析.通过下命令 javap -c Demo.class > Dem ...

  7. 小师妹学JVM之:java的字节码byte code简介

    目录 简介 Byte Code的作用 查看Byte Code字节码 java Byte Code是怎么工作的 总结 简介 Byte Code也叫做字节码,是连接java源代码和JVM的桥梁,源代码编译 ...

  8. JVM源码分析之Java对象头实现

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Java对象头实现 HotSpot虚拟机中,对象在内存中的布局分为三 ...

  9. JVM源码分析之一个Java进程究竟能创建多少线程

    JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...

  10. 通过字节码分析java中的switch语句

    在一次做题中遇到了switch的问题,由于对switch执行顺序的不了解,在这里简单的通过字节码的方式理解一下switch执行顺序(题目如下): public class Ag{ static pub ...

随机推荐

  1. 简单的UrlDns链分析

    URLDNS链学习 首先我们先理解一下序列化与反序列化,我先贴出三段代码,大家可以尝试先体验一下. 首先我们先构造一个Person类,其实跟这条链没什么关系,主要涉及序列化 点击查看代码 // 引入 ...

  2. 力扣608(MySQL)-树节点(中等)

    题目: 给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id . 树中每个节点属于以下三种类型之一: 叶子:如果这个节点没有任何孩子节点.根:如果这个节点是整棵树的根,即没有父节 ...

  3. 为 Serverless Devs 插上 Terraform 的翅膀,解耦代码和基础设施,实现企业级多环境部署(下)

    简介: 在上篇<为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(上)>中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完 ...

  4. 重磅发布 | Serverless 应用中心:Serverless 应用全生命周期管理平台

    ​简介:Serverless 应用中心,是阿里云 Serverless 应用全生命周期管理平台.通过 Serverless 应用中心,用户在部署应用之前无需进行额外的克隆.构建.打包和发布操作,即可快 ...

  5. 双引擎驱动Quick BI十亿数据0.3秒分析,首屏展示时间缩短30%

    ​简介:在规划中,Quick BI制定了产品竞争力建设的三大方向,包括Quick(快)能力.移动端能力和集成能力.针对其中的产品"报表查看打开慢""报表开发数据同步慢&q ...

  6. 钉钉宜搭入选Forrester《中国低代码平台市场分析报告》

    ​简介:  最新:钉钉宜搭入选Forrester<中国低代码平台市场分析报告>! 11月12日,全球知名研究机构Forrester发布<中国低代码平台市场分析报告(The State ...

  7. WPF 由于系统颜色配置 Mscms 组件损坏启动失败

    本文记录 WPF 应用程序,因为系统的颜色配置 Mscms.dll 组件损坏导致应用加载图片失败,从而启动失败的原因和解决方法 在 WPF 应用加载图片时,将会调用到系统的 Mscms.dll 组件. ...

  8. 5.prometheus监控--监控nginx

    1.监控程序环境准备 mkdir /data/docker-compose -p cd /data/docker-compose cat > docker-compose.yaml <&l ...

  9. 6个实例带你解读TinyVue 组件库跨框架技术

    本文分享自华为云社区<6个实例带你解读TinyVue 组件库跨框架技术>,作者: 华为云社区精选. 在DTSE Tech Talk <手把手教你实现mini版TinyVue组件库&g ...

  10. VSCode 在 windows 下默认添加 _WIN32 的问题

    现象 在 VSCode 在 windows 下环境中使用时,会默认添加 _WIN32 ,会出现查看代码时,出现错误提示,现象如下 检测到 #include 错误.请更新 includePath.已为此 ...