0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JVM入门之Class结构介绍1

jf_78858299 来源:北洋洋洋 作者:北洋 2023-02-09 16:57 次阅读

Class文件规范

❝根据《JAVA虚拟机规范》的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中(Class文件格式中)只有两种数据类型:“无符号数”和“表”。

❝本篇文章图中贴出的类型这一列也都是这两个数据类型,如果类型是u开头的表示为无符号数的数据类型,如果是_info结尾的表示是表类型。

  1. 无符号数就是正常的数字,以u1,u2,u4,u8来表示一个,两个,四个,八个字节,通常用来描述数字,索引引用,数量值或者用来表达字符串值。

❝u1在Class文件中为两个数字或字母,比如00,01,0A,6F ; u2在Class文件中为四个数字或字母,比如0001,000A,6C61;

  1. 表是用来描述复合结构的数据,它由无符号数或者其他表构成,并在结尾处用“_info”表示。

❝比如:cp_info为常量池表,field_info为字段表,method_info为方法表,attribute_info为属性表。本篇文章会讲解除了属性表之外的其他表结构,属性表单独写一篇文章进行讲解

  1. 本质上Class结构也是将表和无符号数组合起来的一张表。

Class文件大结构总览

后面讲的所有结构都是按照这个Class文件表讲的,所以这张图先看下。

magic

Class文件的 「头四个字节」 表示魔数,这个值存在于各个文件中,在之前的这篇文章里面讲过这个字段:验证apk文件的magic,magic是用来验证是不是属于某种结构的,即使用户更改了文件的后缀名也没事,通过这个字段就可以看出他是什么类型的文件。「因此每一种文件格式的魔数magic都不一样,因为是用来表示其属于哪种文件格式的。」

❝Class文件的magic为0XCAFFBABE(咖啡宝贝)

Class文件版本号

接下来的两个字节表达的Class文件的 「次版本号(Minor Version)」 ,再接着两个字节表达的是 「主版本号(Major Version)」

❝高版本的JDK能够兼容低版本的Class文件,但是低版本的JDK不能运行高版本的Class文件(规范中Class文件校验必须要求的!)

Constant_Pool常量池

1、Class文件中第一个出现的表结构的数据,主要存放两种常量:「字面量和符号引用。」

❝字面量:Java语言层面常量的概念。eg:字符串,被声明为final的常量等

❝符号引用:编译原理方面的概念。eg:被模块导出或者开放的包(Package) 类和接口的全限定名(也就是类所属的包名和类的名字) 字段的名称和描述符(名称简单理解就是字段名,描述符为字段所属的类型) 方法的名称和描述符(名称简单理解就是方法名,描述符为方法参数和返回值) 方法句柄和方法类型(Method Handle,Method Type,Invoke Dynamic) 动态调用点和动态常量

2、符号引用,由于Class文件是在编译后生成的,因此运行的时候需要 「将符号引用转换为对应数据在内存中的地址」 ,否则使用的时候会找不到真正的内存入口地址(也就是不能被虚拟机直接使用)。

❝当虚拟机做类加载的时候,会从常量池中拿出对应的符号引用,在类创建或者运行时解析,翻译到具体的内存地址之中 比如class文件的类名,当类被加载到虚拟机中时,需要将这个符号引用转换为类真实所在的内存地址才能被正常访问。

3.常量池中存储的数据数量 「从1开始计数」 ,第0项常量空出来是因为有些数据并不需要引用常量池中的数据时,就可以用第0项常量来表达。

4.常量池的数据数量会在版本号之后用两个字节来表达,之后才是常量池中的数据

❝这样做是因为没有Class文件中 「没有分隔符」 来表示一组数据结束,因此Class文件中的数据必须严格按照固定长度,固定数量去存放,不允许改变。

5.常量池中 「每一项常量数据都是一张表」 ,每个表结构中都有一个u1类型的标志位标识自己属于哪种类型的表。

各个表对应的含义

这些表有着各自完全独立的结构,之间没有任何关联。

反编译代码示例

C:\\>javap -verbose TestClass 
Compiled from "TestClass.java" 
public class org.fenixsoft.clazz.TestClass extends java.lang.Object     SourceFile: "TestClass.java"     
minor version: 0     
major version: 50     
Constant pool: 
const #1 = class        #2;     //  org/fenixsoft/clazz/TestClass 
const #2 = Asciz        org/fenixsoft/clazz/TestClass; 
const #3 = class        #4;     //  java/lang/Object 
const #4 = Asciz        java/lang/Object; 
const #5 = Asciz        m; 
const #6 = Asciz        I; 
const #7 = Asciz        ; 
const #8 = Asciz        ()V; 
const #9 = Asciz        Code; 
const #10 = Method      #3.#11; //  java/lang/Object."":()V 
const #11 = NameAndType #7:#8;//  "":()V 
const #12 = Asciz       LineNumberTable; 
const #13 = Asciz       LocalVariableTable; 
const #14 = Asciz       this; 
const #15 = Asciz       Lorg/fenixsoft/clazz/TestClass;; 
const #16 = Asciz       inc; 
const #17 = Asciz       ()I; 
const #18 = Field       #1.#19; // org/fenixsoft/clazz/TestClass.m:I 
const #19 = NameAndType #5:#6;  // m:I 
const #20 = Asciz       SourceFile; 
const #21 = Asciz       TestClass.java;

代码块中Asciz就是之前说的Constant_UTF8_info常量(也就是字符串常量),可以看到这些数据都是由这个常量来组成的,

常量池中常量表对应数据结构内容

第一列常量为之前 「各个表对应的含义」 中提到的表结构类型也就是表的名称;

第二列中的项目为各个表中存放的不同的数据内容有哪些,这些表的数据中都有一个标识位tag用来标识不同的表,在之前 「各个表对应的含义」 中也提到过;

第三列为描述不同于之前讲的表的描述,这列说明的是**「表中存储的不同数据的描述」**

图例:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102995
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128773
  • Class
    +关注

    关注

    0

    文章

    52

    浏览量

    19524
  • 存储数据
    +关注

    关注

    0

    文章

    73

    浏览量

    14031
收藏 人收藏

    评论

    相关推荐

    jvm的类加载器的整体结构及过程解析

    前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢。 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优、垃圾回收机制等等的问题我们
    的头像 发表于 09-27 15:49 3239次阅读
    <b class='flag-5'>jvm</b>的类加载器的整体<b class='flag-5'>结构</b>及过程解析

    Proteus基础入门教程 Proteus界面功能介绍及常用操作

    Proteus基础入门教程 Proteus界面功能介绍及常用操作
    发表于 09-27 22:35

    JavaWeb入门响应的结构

    JavaWeb入门—响应的结构
    发表于 05-15 06:00

    Jvm的整体结构和特点

    的整体结构大致如下:    1、类加载器  类加载器用来加载Java类到JVM虚拟机中,源代码程序.java文件在经过编译器编译之后就被转换成字节代码.class文件,类加载器负责读取
    发表于 01-05 17:23

    Jvm工作原理学习笔记

    [] args)函数的class都可以作为JVM实例运行的起点 b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护
    发表于 04-03 11:03 5次下载

    Java:JVM虚拟机的入门知识

    Java开发现在面试越来越难了,进大厂必备的JVM、多线程高并发这都是最基础的知识了,今天我们一起来学习Java虚拟机入门
    的头像 发表于 07-01 11:43 2071次阅读
    Java:<b class='flag-5'>JVM</b>虚拟机的<b class='flag-5'>入门</b>知识

    关于JVM的调优知识

    最近很多小伙伴跟我说,自己学了不少JVM的调优知识,但是在实际工作中却不知道何时对JVM进行调优。今天,我就为大家介绍几种JVM调优的场景。
    的头像 发表于 09-14 14:54 617次阅读

    JVM入门Class结构介绍2

    本篇文章图中贴出的类型这一列也都是这两个数据类型,如果类型是u开头的表示为无符号数的数据类型,如果是_info结尾的表示是表类型。
    的头像 发表于 02-09 16:57 312次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>入门</b>之<b class='flag-5'>Class</b><b class='flag-5'>结构</b><b class='flag-5'>介绍</b>2

    JVM入门Class结构属性表1

    ❝属性表在《JAVA虚拟机规范》中并没有像其他数据一样做严格的限制,我们甚至可以自己实现一个编译器往Class结构的属性表中注入额外的属性信息,虚拟机运行时会忽略掉它识别不了的属性。
    的头像 发表于 02-10 11:02 356次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>入门</b>之<b class='flag-5'>Class</b><b class='flag-5'>结构</b>属性表1

    JVM入门Class结构属性表2

    ❝属性表在《JAVA虚拟机规范》中并没有像其他数据一样做严格的限制,我们甚至可以自己实现一个编译器往Class结构的属性表中注入额外的属性信息,虚拟机运行时会忽略掉它识别不了的属性。
    的头像 发表于 02-10 11:02 349次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>入门</b>之<b class='flag-5'>Class</b><b class='flag-5'>结构</b>属性表2

    USB Class介绍

    电子发烧友网站提供《USB Class介绍.pdf》资料免费下载
    发表于 08-01 16:19 0次下载
    USB <b class='flag-5'>Class</b>的<b class='flag-5'>介绍</b>

    jvm内存溢出该如何定位解决

    超出限制和堆空间不足。 定位JVM内存溢出问题是一个比较复杂的任务,需要结合工具和技术来进行分析和解决。本文将介绍一些常用的调试和解决内存溢出问题的工具和技术。 一、理解JVM内存结构
    的头像 发表于 12-05 11:05 626次阅读

    jvm内存模型和内存结构

    JVM(Java虚拟机)是Java程序的运行平台,它负责将Java程序转换成机器码并在计算机上执行。在JVM中,内存模型和内存结构是两个重要的概念,本文将详细介绍它们。 一、
    的头像 发表于 12-05 11:08 399次阅读

    jvm调优参数

    栈和类元数据等方面的参数设置。下面我们将详细介绍这些参数以及如何进行优化。 首先,堆内存是JVM中用于存放对象实例的内存区域。通过调整堆内存的大小,我们可以控制应用程序对内存资源的使用。JVM的堆内存包括新生代和老年代两部分。新
    的头像 发表于 12-05 11:29 342次阅读

    jvm参数的设置和jvm调优

    JVM(Java虚拟机)参数的设置和调优对于提高Java应用程序的性能和稳定性非常重要。在本文中,我们将详细介绍JVM参数的设置和调优方法。 一、JVM参数的设置 内存参数: -Xms
    的头像 发表于 12-05 11:36 500次阅读