zoukankan      html  css  js  c++  java
  • 实战JAVA虚拟机 JVM故障诊断与性能优化(九)---Class文件结构

      对于java虚拟机来说,Class文件是虚拟机的一个重要接口,无论使用何种语言开发,只要能编译为正确的Class文件,那么这种语言就可以在java虚拟机上执行,Class文件就是Java虚拟机的基石,

        

    1、Class文件总体结构

            

      java虚拟机规范的定义,一个Class文件可以非常严谨地被描述称:

      

      

      u1,u2,u4,u8分别表示无符号单字节,2字节,4字节和八字节

      Class文件的结构严格按照该结构定义:

        (1) 文件以一个4字节的Magic(被称为魔术)开头,紧跟着两个大小版本号。

        (2) 版本号之后是常量池,

        (3) 常量池之后是类的访问修饰符、代表自身类的引用,父类引用以及接口数量和实现的接口引用

        (4) 在接口后,有字段的数量和字段描述、方法数量以及方法描述

        (5) 最后,存放着类文件属性信息。

    重要部分解释:

     常量池

        常量池表现和其TAG值

      

      方法的执行主体-Code属性

      方法的主要内容存放在其属性中,它存放着方法的字节码信息,

      

      记录行号--LineNumberTable属性

         用于记录字节码偏移量和行号的对于关系,在软件调试时,该属性有着至关重要的作用,若没有它,则调试器无法定位到对应的源码

         

        attribute_name_index 为指向常量池的索引,在LineNumberTable属性中,该值为"LineNumberTable"属性中,attribute_length为4字节无符号整数,表示属性长度

        line_number_table_length表明了表项有多少条记录

      保存局部变量和参数--LocalVariableTable属性

        

      加快字节码校验--StackMapTable属性

        对jdk1.6以后类文件,每个方法的Code属性还可能含一个StackMapTable属性结构。该结构中存有若干个叫做栈映射帧(stack map frame)的数据。该属性不包含运行时所需信息。该属性不包含运行时所需的信息,

        仅用作Class文件的类型校验。

        StackMapTable结构如下:

        

        attribute_name_index为常量池索引,恒为"StackMapTable",attribute_length为属性的长度,number_of_entries为栈映射帧的数量,entries则为具体的内容,每一项为一个stack_map_frame结构。

    Code属性总结:

      Code属性常用内容:

          

    抛出异常--Exceptions属性

      除了Code属性外,每一个方法都可以有一个Exceptions属性,用于保存该方法可能抛出的异常信息,

      

      attribute_name_index指定了属性的名称,指向常量池的索引,恒为"Exceptions",attribute_length表示属性的长度,number_of_exceptions表示表现数量即可能抛出的异常个数,

      最后exception_index_table项罗列了所有的异常,每一项为指向常量池索引,对应常量为CONSTANT_Class,为一个异常类。

    ASM--介绍

      ASM是一款Java字节码的操作库,它在Java领域是赫赫有名的函数库。不少著名软件都依赖该库进行字节码操作。比如:AspectJ、Clojure、Eclipse、Spring以及Cglib都是ASM的使用者。

  • 相关阅读:
    [SQL] 外卖系统数据库设计
    [PHP] 遗传算法求函数最大值一般实现
    PHP CURL根据详细地址获取腾讯地图经纬度
    PHP 递归读取无限级分类
    PHP 仿网易云的评论盖楼
    JavaScript清除空格、换行,把双引号转换成单引号
    百度地图小Demo---获取当前地址以及拖拽显示地址
    基于Modbus的C#串口调试开发
    二叉树的中序遍历
    二叉树的前序遍历
  • 原文地址:https://www.cnblogs.com/kaishi/p/7807058.html
Copyright © 2011-2022 走看看