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

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

3天内不再提示

JVM入门之Class结构属性表1

jf_78858299 来源:北洋洋洋 作者:北洋 2023-02-10 11:02 次阅读

上篇文章提到过在Class结构表中,属性表存在于Class表,字段表和方法表中,是为了 「描述额外的信息

❝属性表在《JAVA虚拟机规范》中并没有像其他数据一样做严格的限制,我们甚至可以自己实现一个编译器往Class结构的属性表中注入额外的属性信息,虚拟机运行时会忽略掉它识别不了的属性。

属性表属性总览

这张图中按Class结构,字段表,方法表这三个维度进行了区分标注,将 「三者共有的属性」 提取到最顶部的 「黄色椭圆」 中, 「蓝色」 代表各自属性表 「额外用到的属性」「红色」 代表 「Code属性中引用的其他属性的集合」图片

引自《深入理解JAVA虚拟机》,读者也可以看这下面的两张图:图片图片

属性结构

图片首先表结构中的前两个字节说明该属性是叫什么名字,也就是什么类型的属性,最终指向常量池中的CONSTANT_Utf8_info类型的常量。

❝eg:Code,ConstantValue,SourceFile。。。等

接着用四个字节描述属性值的长度,也就是说明属性值所占用的字节数;

❝除了第一个属性名称信息和该属性描述的属性长度,其他的就是属性值了,因此该值(属性值长度)固定为 整个属性表长度-6个字节

最后列出属性信息,有多少属性信息呢?前四个字节已经列出了这个属性包含多少个属性,因此最后描述各个属性的信息。

前两个属性是所有属性都共有的,之后就不进行讲解了。

常见属性

Code

❝只有方法内有方法体的方法表才会有这项属性,像抽象方法,非defult接口方法是没有这个属性的(没有方法体)


「该属性用于存放 操作数栈最大深度, 本地变量表最大占用存储空间, 方法中Catch块定义的异常类型和数量, 编译后方法体的字节码指令和指令长度, 还有其他属性」


首先先看下Code属性表的结构:图片


1.「max_stack操作数栈最大深度」

先看下之前的这篇文章,Java程序运行是基于栈的操作,就是说的该项属性。

通过指令从本地变量表中拿数据放到栈顶;将数据从栈顶保存到本地变量中;对栈顶两个值进行运算后将结果压入栈顶;将栈顶的值作为返回结果return.....等等这些都是通过操作数据结构栈来完成的。

❝这项属性描述了方法中操作数栈的最大深度,虚拟机运行时会根据这项属性来分配栈帧中操作数栈的最大深度。


2.「max_locals局部变量表所需空间」

局部变量表最大占用的存储空间,存储的单位用的是Slot(变量槽),一个 Slot占用空间大小为32位。

存储范围:比如方法的参数,Catch块中定义的异常类型,方法体中定义的局部变量。

❝对于方法参数来说,根据实例方法(通过对象才能访问)和静态方法(通过类名就可以直接访问)又有不同;实例方法的参数中第一个是this,该变量会在编译时加入,而静态方法则没有这个变量。

存储空间:对于小于32位的数据类型用一个变量槽,大于32位的用多个变量槽存储(比如小于64位的数据类型double和long用两个变量槽存储)。优化:对变量限定作用域,如果变量超出了作用域范围,那么存储该变量的Slot进行存储其他的变量,也就是重用变量槽。

❝根据同时生存的最大局部变量数量和类型计算出max_locals的大小。


3.「code_length,code属性用于表述方法体编译后的字节码指令长度和字节码指令流」

❝字节码指令流,一个字节代表一条指令,即每条指令就是一个u1类型的单字节;u1数据类型取值范围是0X00~0XFF,对应十进制为0到255。即u1可以表达256条指令,目前使用的大约只有200条

❝方法体中不允许超过65535条字节码指令,如果超出了编译器拒绝编译;但是code_length用的是u4长度值,可以达到2的32次幂,相当于指令长度只用了一半(u2长度)。


4.「exception_table_length,exception_table用于描述方法块中Catch块定义的异常数量和类型」

❝如果方法体内部没有catch块则length为0,后面的字节不描述exception_table

图片

在这里插入图片描述

❝Exception table:

from to target type

0 5 10 Class java/lang/Exception

0 5 21 any

10 16 21 any


Exceptions

该属性和上面提到的exception_table描述的信息不一样,exception_table是描述方法体中Catch块中定义的异常数量和类型;而该项属性是描述方法throws的异常数量和类型,通俗来说就是调用该方法需要catch的异常,也叫作受查异常。

❝因此上面的excepitons_table描述方法体内部Catch的异常,Exceptions描述方法抛出的异常

结构:图片


LineNumberTable

❝用于描述Java代码行号和字节码行号的对应关系,该项属性可选择是否输出

❝用处:当执行某段字节码指令抛出异常时可以根据这个对应关系,提示开发者Java代码对应的行号。

结构图片


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

    关注

    19

    文章

    2904

    浏览量

    102995
  • Class
    +关注

    关注

    0

    文章

    52

    浏览量

    19524
  • JVM
    JVM
    +关注

    关注

    0

    文章

    152

    浏览量

    12129
收藏 人收藏

    评论

    相关推荐

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

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

    JavaWeb入门响应的结构

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

    jQuery的基本选择器和class属性操作

    jQuery的基本选择器和class操作和属性操作
    发表于 05-19 13:04

    Jvm的整体结构和特点

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

    Linux快速入门文件类型及文件属性

    《嵌入式Linux应用程序开发详解》第一章 Linux 快速入门1.3.1 文件类型及文件属性1.文件类型1)普通文件2)目录文件 3)连接文件 4)设备文件2文件
    发表于 12-17 07:58

    基于节点连接结构属性值的属性图聚类匿名化方法

    社交网络中积累的海量信息构成一类图大数据,为防范隐私泄露,一般在发布此类数据时需要做匿名化处理.针对现有匿名方案难以防范同时以结构属性信息为背景知识的攻击的不足,研究一种基于节点连接结构
    发表于 12-26 11:22 0次下载
    基于节点连接<b class='flag-5'>结构</b>和<b class='flag-5'>属性</b>值的<b class='flag-5'>属性</b>图聚类匿名化方法

    Jvm工作原理学习笔记

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

    Java:JVM虚拟机的入门知识

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

    参数化Class中的静态属性

    static属性一般是在编译的时候就已经分配了内存,并被这个类的所有实例共享, 也就是在仿真时刻0之前就已经完成了静态属性的内存分配。 但是,参数化类中的静态属性可能有所区别。参数化类中的静态
    的头像 发表于 12-02 09:17 929次阅读

    JVM入门Class结构介绍1

    ❝根据《JAVA虚拟机规范》的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中(Class文件格式中)只有
    的头像 发表于 02-09 16:57 406次阅读
    <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

    本篇文章图中贴出的类型这一列也都是这两个数据类型,如果类型是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>介绍2

    JVM入门Class结构属性表2

    属性表在《JAVA虚拟机规范》中并没有像其他数据一样做严格的限制,我们甚至可以自己实现一个编译器往Class结构属性表中注入额外的属性
    的头像 发表于 02-10 11:02 348次阅读
    <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内存溢出该如何定位解决

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

    jvm内存模型和内存结构

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

    jvm参数的设置和jvm调优

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