实战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的使用者。

 

posted on 2017-11-09 00:38  Xiaox-xin  阅读(211)  评论(0编辑  收藏  举报

导航