`
xzc520
  • 浏览: 14930 次
  • 来自: 杭州
社区版块
存档分类
最新评论

深入jvm笔记-class文件

    博客分类:
  • java
阅读更多

javaclass文件

         javaclass文件是对java程序二进制文件格式的精确定义,它使得所有java虚拟机都能够正确地读取和解释。

 

class文件内容

         javaclass文件包含了java虚拟机所需要知道的,关于类或者接口的所有信息。

 

ClassFile是可变表

        

magic

class文件的前4个字节,0xCAFEBABE。它可以辨别出javaclass文件和非class文件。

 

minor_versionmajor_version

主次版本号。

 

constant_poolconstant_pool_count

常量池包含了类和接口的常量。在实际列表constant_pool之前,是入口在列表中的计数constant_pool_count

每个常量池入口都从一个长度为一个字节的标志开始的,一旦java虚拟机获取并解析这个标志,java虚拟机就会知道在标志后的常量类型是什么。

 

access_flags

 

this_class

它是一个对常量池的索引,这个位置的常量池必须是CONSTANT_Class_info表。表由两个部分组成 :标签和name_index, 标签部分是一个具有CONSTANT_Class值常量,在name_index位置的常量池入口为一个包含了类或接口全限定名的CONSTANT_Utf8_info表。

super_class

两个字节的常量池索引,指向类超类的全限定名的CONSTANT_Class_info入口。除了Object类以外,常量池索引super_class对于所有的类均有效,对于Object类,super_class的值为0,对于接口,在常量池入口super_class位置项为java.lang.Object

 

interfaces_countinterfaces

文件中出现在该类的直接实现或者由接口所扩展的父接口的数量。计数后面是interfaces数组,包含了对每个由该类或者接口直接实现的父接口的常量池索引。

 

fields_count fields

class文件中,紧接在interfaces后面是对类或者接口中所声明的字段的描述。fields_count类变量和实例变量的总和。后面是不同长度的field_info表的序列(fields_count指出序列中有多少个field_info)

 

methods_countmethods

对于该类或者接口中声明的方法的描述。

methods_count是一个双字节长度的对于该类型或者接口中声明的所有方法的总计数。

后面是方法本身,它在一个method_info表的列表中进行了阐述(methods_count指出了列表中有多少个method_info表)

method_info表包含了与方法相关的一些信息,包括方法名和描述符。

 

attributes_countattributes

文件中类或者接口所定义的属性的基本信息。属性部分由attributes_count开始,attributes_count是指出现在后续attributes列表中的attribute_info表的数量总和。attribute_info的第一项指向常量池中CONSTANT_Class_info表的索引,该表给出了属性的名称。java虚拟机定义了两种属性 sourcecodeinnerclasses

 

特殊字符串

常量池中容纳符号引用包括三种特殊字符串:全限定名,简单名称和描述符。

         全限定名 当常量池入口指向类或者接口时,它们给出类或者接口的全限定名。

         简单名称 字段名和方法名以简单名称(非全限定名)形式出现在常量池入口中。

         描述符 除了类和接口的全限定名和简单字段(或方法)名,指向字段和方法的符号引用还包含描述字符串。字段描述符给出了字段的类型,方法描述符给出了方法的返回值和方法参数的数量,类型以及顺序。

 

常量池

         常量池是一个可变长度cp_info表的有序序列。

 

CONSTANT_Utf8_info

 

 

 

 

 

常量池

         常量池是一个可变长度cp_info表的有序序列。这些cp_info表通常形式

 

cp_info表中tag(标志)项是一个无符号的byte 类型值,它表明了表的类型和格式。cp_info表一共有11种类型

 

CONSTANT_Utf8_info

使用一种UTF-8格式的变体来存储一个常量字符串。这种类型的表可以存储多种字符串。

文字字符串

被定义的类和接口的全限定名

被定义的类的超类的全限定名

被定义的类和接口的父接口的全限定名

由类或者接口声明的任意字段的简单名称和描述符

由类或者接口声明的任意方法的简单名称和描述符

任何引用的类和接口的全限定名

任何引用的字段的简单名称和描述符

任何引用的方法的简单名称和描述符

与属性相关的字符串

CONSTANT_Utf8_info表中存储了四种基本信息类型:文字字符串,被定义的类和接口描述,对其它类或者接口的符号引用以及属性相关的字符串。一些属性相关的字符串

unicode字符两个字节表示,ASCII字符一个字节表求

 

tag项的值为CONSTANT_Utf8(1)

length给出了后续bytes项的长度

bytes项中包含按照变体UTF-8格式存储的字符串中的字符。’\u0001’’\u007f’的所有字符一个字节表示

 

 

’\u0800’’\uffff’的所有字符三个字节表示

 

CONSTANT_Integer_info

用来存储常量int类型值,只存储int值,不存储符号引用

 

tag项的值为CONSTANT_Integer(3)

bytes 按照高位在前的格式存储int类型的值

CONSTANT_Float_info

CONSTANT_Long_info

CONSTANT_Double_info

CONSTANT_Class_info

 

tag项的值为CONSTANT_Class(7)

name_index 项给出了包含类或接口的全限定名的CONSTANT_Utf8_info表的索引。

 

CONSTANT_String_info

CONSTANT_Fieldref_info

 

class_index 给出了声明被引用字段的类或者接口的CONSTANT_Class_info入口索引。

name_and_type_index 提供了CONSTANT_NameAndType_info入口索引,该入口提供了字段的简单名称以及描述符。

CONSTANT_Methodref_info

CONSTANT_InterfaceMethodref_info

CONSTANT_NameAndType_info 构成了指向字段或者方法的符号引用的一部分。

 

字段

在类或者接口中声明的每一个字段都由class文件中的一个名为field_info的可变长度的表进行描述。

 

 

 

 

方法

 

 

 

 

属性

 

        

 

 

 

Code属性

可变长度的Code_attribute 表定义了方法的字节码序列和其它信息。在所有不是抽象或者本地方法的method_info信息中,都存在一个Code_attribute表。

 

 

具体项含义参看书中解释。

ConstantValue属性

固定长度的ConstantValue属性出现在值为常量的字段field_info表中。详见书。

Deprecated属性

固定长度的Deprecated属性存在field_info,method_infoClassFile表内的attributes项中,是一个可选的项,指出了禁用的字段,方法或者类型 详见书。

Exceptions属性

可变长度的Exceptions属性列出了方法可能抛出的异常。

InnerClasses属性

可变长度的InnerClasses属性对名字,访问标志以及被声明为成员的任何嵌入类型的外围类型,或者用别的方法由类或者接口陈述的类型。

LineNumberTable属性

可变长度LineNumberTable属性建立了方法字节码流偏移量和源代码行号之间的映射关系。

LocalVariableTable属性

可变长度LocalVariableTable属性建立了方法的栈帧局部变量部分内容与源代码中局部变量的名称和描述符之间的映射关系。

SourceFile属性

固定长度SourceFile属性可能存在于ClassFile表内属性项中,它是一个可选的项,它提供了产生class文件的源文件的名称。

Synthetic属性

固定长度Synthetic属性可能存在于field_info,method_infoClassFile表内的atrributes项中,它是一个可选的项,它指明了为编译器产生的字段,方法,或者类型。

分享到:
评论

相关推荐

    java笔记-帮助文档

    而JAVA不同, 他先是把自己的源代码编译成字节码(JVM语言),然后再将JVM 编译成相应的平台语言。 public class HelloWorld{ public static void main(String[] args){ System.ont.println("我的第一个JAVA程序!!")...

    JVM性能优化相关面试题21道.pdf

    JVM 面试题:Java 类加载过程、JVM 加载 Class 文件的原理机制、Java内存分配

    JAVA--达内培训笔记

    java语言是先编译后解释,java源码是通过编译生成一种特殊的.class的中间字节码文件,然后再由JVM进行解释运行。 (编译) (解释) .java ----> .class ---> 可执行文件 所以效率低,是C++的20倍 5、java源...

    java jdk8 学习笔记

    Java编译语言将Java代码编译成.class文件(只有一种形式),而C/C++语言将代码编译成01码,不同的操作系统的01码指令不同,这造成了不能跨平台,而Java将这个任务交给JVM,不同操作系统上的JVM将.class文件编译成不同...

    6.1.1.JVM前奏篇笔记1

    2.1 源码 2.2 编译过程 2.3 类文件(Class文件) 3.3 初始化(Initialize) 3.4 类加载机制图解 4.1 分类 4.2 图解 4

    awk-jvm:在awk中的玩具jvm

    示例(请参见run.sh): javac Add.java && hexdump -v -e '/1 "u "' Add.class | awk -f jvm.awk javac Add.java && hexdump -v -e '/1 "u "' Add.class | awk -f jvm.awk 它能做什么? 不是很多(例如,调用方法...

    cyc学习笔记.pdf

    2021秋招学习笔记总结,包含Java基础、Java并发、数据库、redis等常用后端技术等内容。数据类型 注:包装类型中一般设有缓冲池,比如Integer、String。 1、Integer缓存池范围-128~127都是同一个地址,在缓存池范围...

    JVM学习笔记(一)——类的加载机制

    ​ 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动...

    【隐匿的学习笔记】JVM(1) 类加载子系统

    其实就是JVM运行的第一步 讲class文件加载的过程 这个过程分为三步 加载 链接 初始化 也就是简图中的第一步 加载load 加载都做了什么? 1.通过类的全限定名获取定义此类的二进制字节流 ----> 其实就是把磁盘上 ...

    java7rt.jar源码-Java_JVM:这是我的JavaJVM学习笔记

    Java_JVM This is my Java JVM learn notes JVM: java虚拟机 一:上篇——内存与垃圾回收器 二:中篇——字节码与类的加载 三:下篇——性能监控与调优篇 一: 上篇——内存与垃圾回收器 架构: jvm依赖的架构: 栈架构...

    java7rt.jar源码-JVM:JVM学习笔记

    java7 rt.jar源码虚拟机 ...class CallableDemo { public static void main ( String [] args ) throws ExecutionException , InterruptedException { FutureTask task = new FutureTask ( new MyThread2 ()); n

    java8rt.jar源码-fwh-JVM:对于JVM情况

    有道云笔记 Idea开发工具 GItHub项目地址 分析: 类加载运行全过程: 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。 public class Math { public static final int ...

    day021-反射和注解笔记和代码.rar

    3、Class的实例就看成是Java中我们学过的所有的数据类型在JVM中存在的一种状态(字节码对象) String.class int.class List.class int[].class 1.概念:通过一个全限定类名,获取字节码文件 2...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对应关系。必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容...

    Google Android SDK开发范例大全(完整版)

    需要注意的是,这个 VM 并非您想象中的 JVM,而是 Dalvik Virtual Machine,这是一种开源技术。每个 Android 应用程序都在 Dalvik VM 的一个实例中运行,这个实例驻留在一个由 Linux 内核管理的进程中,如下图所示。...

    java8集合源码分析-AboutJava:java相关知识(理论,代码)相关知识均是看书,博客等地方获取再由自己整理,如存在侵权,请告诉我

    (很多笔记来自java并发艺术一书) 多线程基础 synchronized volatile 线程间的通信 锁(重入锁,读写锁) 并发工具 增强的Future CompletableFuture 线程池技术 Java线程池Executors ForkJoin框架 原子操作类 JVM ...

    积分java源码-java-11:Java11OCP学习笔记

    (JVM)是一个可执行文件。 当 JVM 运行时,它会加载给定的类并查找要运行的该类的主要方法。 JVM 的可执行文件名为 java。 每个 Java 类都属于一个包。 源文件中最多可以有一个 package 语句,并且它必须是文件中的第...

    net学习笔记及其他代码应用

    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...

    Java学习笔记

    一、JAVA SE基础 1、开发语言基本包括:数据类型、循环控制语句、数组、方法 2、面向对象:最终是面向接口编程的,封装...JAVA提供多线程、提供动态下载程序代码的机制、安全性,它的操作以字节码(class)文件形式保存

Global site tag (gtag.js) - Google Analytics