JVM深入原理(三+四):JVM组成和JVM字节码文件

简介: 目录3. JVM组成3.1. 组成-运行时数据区3.2. 组成-类加载器3.3. 组成-执行引擎3.4. 组成-本地接口4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas

 

JVM系列文章

  1. 深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器_eden used total max-CSDN博客
  2. JVM深入原理(一+二):JVM概述和JVM功能-CSDN博客
  3. JVM深入原理(三+四):JVM组成和JVM字节码文件-CSDN博客
  4. JVM深入原理(五):JVM组成和JVM字节码文件-CSDN博客
  5. JVM深入原理(六)(一):JVM类加载器-CSDN博客
  6. JVM深入原理(六)(二):双亲委派机制-CSDN博客
  7. JVM深入原理(七)(一):运行时数据区-CSDN博客
  8. JVM深入原理(七)(二):运行时数据区-CSDN博客
  9. JVM深入原理(八)(一):垃圾回收-CSDN博客
  10. JVM深入原理(八)(二):垃圾回收-CSDN博客

目录

3. JVM组成

3.1. 组成-运行时数据区

3.2. 组成-类加载器

3.3. 组成-执行引擎

3.4. 组成-本地接口

4. JVM字节码文件

4.1. 字节码文件-组成

4.1.1. 组成-基础信息

4.1.1.1. 基础信息-魔数

4.1.1.2. 基础信息-主副版本号

4.1.2. 组成-常量池

4.1.3. 组成-方法

4.1.3.1. 方法-工作流程

4.1.4. 组成-字段

4.1.5. 组成-属性

4.2. 字节码文件-查看工具

4.2.1. javap

4.2.2. jclasslib

4.2.3. 阿里Arthas


3. JVM组成

  • JVM组成结构

    image.gif 编辑

3.1. 组成-运行时数据区

  • 运行时数据区域的作用:负责管理JVM运行时使用到的内存,比如创建对象和销毁对象
  • 运行时数据区结构

    image.gif 编辑

3.2. 组成-类加载器

  • 类加载器的作用:将.class字节码文件加载到运行时数据区,JVM分配在堆中分配一块空间存放字节码文件中的类和接口

3.3. 组成-执行引擎

  • 执行引擎的作用:将字节码文件中的指令翻译成机器码,同时使用及时编译器优化性能
  • 执行引擎的组成及作用:
  • 即时编译器:将热点代码的机器码存入操作系统内存
  • 解释器:实时翻译字节码中的指令为机器码
  • 垃圾回收器:回收未被引用的对象

3.4. 组成-本地接口

  • 本地接口:调用本地已实现的接口,如JVM中由c,c++提供的方法

4. JVM字节码文件

4.1. 字节码文件-组成

4.1.1. 组成-基础信息

  • 基础信息作用:包含了魔数,字节码对应Java版本号,访问标识,类/父类/接口的索引

    image.gif 编辑

    image.gif 编辑

4.1.1.1. 基础信息-魔数

  • 如何确定文件类型?
  • 文件是通过文件的前几个字节(称为文件头)来确定文件的类型,而不是通过文件扩展名来确定
  • 软件要打开文件首先要校验文件头,如果不匹配则报错
  • 常见文件的文件头:

    image.gif 编辑
  • 魔数的作用:作为字节码文件的头文件标识,固定为0xCAFEBABE

4.1.1.2. 基础信息-主副版本号

  • 主版本号的作用:用来标识大版本号,判断当前字节码文件对应Java版本号是否与当前版本号兼容,一般是大版本号兼容小版本号
  • 副版本号的作用:主版本号相同时区分不同小版本的标识
  • JDK1对应45,JDK2对应46,JDK6对应50,JDK8对应52

    image.gif 编辑

4.1.2. 组成-常量池

  • 常量池的作用:保存字符串常量,类名,接口名,字段名,用于字节码指令的符号引用,可以避免相同内容的重复定义
  • 常量池工作流程:常量池中的常量都有一个从1开始的编号,在字节码指令中通过编号可以快速找到对应的数据,这个过程叫做符号引用


  • image.gif 编辑

    image.gif 编辑

    image.gif 编辑

4.1.3. 组成-方法

  • 方法的作用:存放字节码指令,其Code属性存放字节码指令具体内容

    image.gif 编辑

4.1.3.1. 方法-工作流程

  • 方法的工作流程:按照字节码指令从上至下依次执行,需要用到虚拟机栈中的两个区域:操作数栈和局部变量表


  • image.gif 编辑
  1. iconst_0:将常量0压入栈中.
  2. istore_1:将栈中的数据弹出存入局部变量表1号位置.
  3. iload_1:将局部变量表1号数据拷贝压入栈中.
  4. iconst_1:将常量1压入栈中.
  5. iadd:将栈中数据弹出,执行完累加操作后,把结果压入栈中.
  6. istore_2:将栈中的数据弹出存入局部变量表2号位置.


  • image.gif 编辑
  1. iconst_0:将常量0压入栈中.
  2. istore_1:将栈中的数据弹出存入局部变量表1号位置.
  3. iload_1:将局部变量表1号数据(0)拷贝压入栈中.
  4. iinc 1 by 1:将局部变量表1号数据加1
  5. istore_1:将栈中的数据(0)弹出覆盖局部变量表1号位置.
  6. return:返回结果0,
  • ++i和i++的区别:
  • ++i:先执行iinc后执行iload,先加后入再弹,最终数据+1
  • i++:先执行iload后执行iinc,先如后加再弹,最终数据不变
  • i++; i+=1; i=i+1; 的执行效率:
  • i++; i+=1;:仅有一行iinc运算,效率高
  • i=i+1;:有ioad,iconst,iadd,istore四行运算,效率低

4.1.4. 组成-字段

  • 字段的作用:保存类中定义的属性信息,包括属性的访问修饰符、属性名称、属性类型等等

4.1.5. 组成-属性

  • 属性的作用:保存类的相关属性,比如源代码文件名,内部类的列表等等

4.2. 字节码文件-查看工具

  • 字节码文件中保存的是Java代码编译后的内容,并以二进制方式存储,无法直接用记事本打开

4.2.1. javap

  • javap的作用:javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容.
  • javap的适用场景:javap使用方便,在jdk环境中即可使用,适合在服务器上查看字节码文件
  • javap的用法:
  • 查看指定的字节码文件:javap -v xx.class > xx.txt,字节码文件和输出位置需要指定全路径名
  • javap所有用法:

    image.gif 编辑

4.2.2. jclasslib

  • idea下载插件jclasslib
  • 点击Java源代码文件后点击视图展示字节码文件
  • 修改Java源码后需要进行一次编译(ctrl+shift+f9)才能看到修改后的字节码文件


  • image.gif 编辑

4.2.3. 阿里Arthas

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

    image.gif 编辑
  • Arthas官网:简介 | arthas
  • Arthas使用:
  • 启动Arthas:java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
  • 加载运行时字节码到指定目录:dump -d D:/arthas/data/ org.pickstar.arthas.Demo
  • 反编译运行时字节码为Java源码:jad org.pickstar.arthas.Demo

    image.gif 编辑


  • image.gif 编辑


  • image.gif 编辑
目录
相关文章
|
30天前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
201 55
|
30天前
|
Oracle Java 关系型数据库
JVM深入原理(一+二):JVM概述和JVM功能
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行。
56 0
|
30天前
|
存储 安全 Java
JVM深入原理(五):JVM组成和JVM字节码文件
类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析。
26 0
|
2月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
118 6
|
5月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
793 166
|
3月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
219 29
JVM简介—1.Java内存区域
|
7月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1315 1
|
3月前
|
消息中间件 Java 应用服务中间件
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
108 12
JVM实战—2.JVM内存设置与对象分配流转
|
3月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
3月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?