6.1 关于类文件

  1.class文件的一次编译,到处运行的跨平台性; 

  2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就可以在JVM上运行;

6.2 类文件结构

  PS:任何一个Class文件都对应一个类或者接口,但是一个类或者接口不一定都得定义在文件里,因为有类加载器的存在可以;

  CLass文件结构的两部分:(1)无符号数:u1、u2、u4、u8(数字代表所占的字节数),数字、索引引用;(2)表:_info;

  1.魔数:

    (1)每个Class文件的头四个字节u4: 0xCAFEBABE ,用于标志Class文件;

    (2)第五第六字节:次版本号Minor Version,第七第八字节:主版本号:Major Version,主版本号决定了高版本JDK可以兼容运行低版本Class文件,但是低版本JDK不能运行高版本Class文件;

  2.常量池:

    (1)常量池入口位于主版本号之后;

    (2)两大常量:①字面量(更接近Java中的常量定义);②符号引用:类和接口的全限定名(Fully-Qualified Name)、字段的名称和描述符(Descriptor)、方法的名称和描述符;

  3.访问标志falg:

    常量池后面两位,用于表示是否是:public、final、super、interface、abstract等修饰的类;ACC_xxxx所修饰;

  4.类索引(this_class)、父索引(super_class)、接口索引(interfaces):

    (1)类索引和父索引都是一个u2类型的数据,而接口索引是u2类型的数据集合;

    (2)类索引和父索引各自 -> 类描述常量 CONSTANT_CLass_info  ->  CONSTANT_Utf8_info ;

  5.字段表集合(field_info)

    (1)用于描述接口或类中的变量,不包括局部变量,用于表示其:作用域(public、private、protected)、静态(static)、常量(final)、数据类型(基本数据类型、数组、对象);

    (2)字段表结构:① access_flags :表示字段修饰符,u2数据类型;② name_index :简单名称(变量的名称),是对常量池的引用;③ descripter_index :描述符(描述字段的数据类型,在方法表中是描述参数的列表和返回值),也是对常量池的引用 ;④  attribute_info :最后是属性表,存储额外的信息,比如变量的初始值;

  6.方法表集合

    结构和字段表类似,只是用于表示方法,方法中的代码内容保存在属性表 attribute_info的Code属性中;

  7.属性表集合

6.3字节码指令

   JVM的字节码指令由以下构成:①操作码:一个字节长度的数字,代表着某种操作;②操作数:紧跟操作码后面的零至多个的参数,代表此操作需要的参数;

  字节码指令包括:加载和存储指令(栈帧中局部变量表和操作数栈之间的来回传输),运算指令(两个操作数栈上的值进行运算加减乘除等),类型转换指令,对象创建于访问指令,操作数栈管理指令(出栈、复制栈顶、栈顶两个数值互换),控制转移指令(条件分支、复合条件分支、无条件分支),方法调用和返回指令,异常处理指令

  

  

    

  

深入理解JVM(六)类文件结构的更多相关文章

  1. JVM(4) 类文件结构

    一.实现“平台无关性” 字节码(ByteCode)存储格式和虚拟机是实现语言无关性的基础.Java虚拟机不和包括Java在内的任何语言绑定,它只与“Clas”文件这种特定的二进制文件格式所关联,Cla ...

  2. JVM小结--类文件结构

    字节码是构成Java平台无关性的基石.实现语言无关性的基础是虚拟机和字节码存储格式. Java语言中的各种变量.关键字和运算符的语义最终是由多条字节码命令组成,因此字节码命令所能提供的语义描述能力肯定 ...

  3. 深入理解JVM(六) -- GC执行原则和方案

    上篇文章中,我们了解了Java虚拟机垃圾回收的思路和策略,这篇文章我们将了解Java是如何实现高效的回收算法的. 我们需要了解,内存回收必须要保证“一致性”,意思就是在执行GC分析的时候,系统看起来要 ...

  4. 《深入理解java虚拟机》第六章 类文件结构

    第六章 类文件结构   6.2 无关性的基石 各种不同平台的虚拟机与所有的平台都统一使用的程序存储格式--字节码(ByteCode)是构成平台无关性的基石.java虚拟机不和包括java在内的任何语言 ...

  5. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  6. 《深入理解Java虚拟机》类文件结构

    上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...

  7. 【搞定Jvm面试】 面试官:谈谈 JVM 类文件结构的认识

    类文件结构 一 概述 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机.Java 语言通过字节码的方式,在一定程度上解决 ...

  8. 四、JVM — 类文件结构

    类文件结构 一 概述 二 Class 文件结构总结 2.1 魔数 2.2 Class 文件版本 2.3 常量池 2.4 访问标志 2.5 当前类索引,父类索引与接口索引集合 2.6 字段表集合 2.7 ...

  9. 《深入理解java虚拟机》笔记——简析java类文件结构

    一直不太搞得明确jvm究竟是如何进行类载入的,在看资料的过程中迷迷糊糊.在理解类载入之前,首先看看java的类文件结构究竟是如何的,都包含了哪些内容. 最直接的參考当然是官方文档:The Java® ...

随机推荐

  1. Python NLP完整项目实战教程(1)

    一.前言 打算写一个系列的关于自然语言处理技术的文章<Python NLP完整项目实战>,本文算是系列文章的起始篇,为了能够有效集合实际应用场景,避免为了学习而学习,考虑结合一个具体的项目 ...

  2. <Vector Calculus>(by Paul C, Matthews) Notes

    现在流行用Exterior Caculus, 所以个人觉得Matthews这本书有点过时了. 想学Vector Calculus的话,推荐<Vector Calculus, Linear Alg ...

  3. mongodb 安装使用备记

    # 1.1 安装 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931B ...

  4. iOS上传本地代码到git

    1.顾名思义,首先你得注册一个github账户 这个我就不细说了. 2.然后你得创建一个 repository  步骤见下图 3.相当于创建成功 会跳到下图界面 4.一看就很清楚了 create a ...

  5. [UE4]Spacer

    一.Spacer:留白占位控件 二.如下图所示,如果想要2个按钮都在容器右对齐: 三.可以放一个Spacer到最左边,设置成Fill,Spacer控件就是起到占位的作用.  

  6. 模拟SQL用户 EXECUTE AS USER

    EXECUTE AS USER= @domain SELECT SUSER_NAME(), USER_NAME(); REVERT 以下语句可以模拟SQL用户,具体使用场景自行脑补.

  7. HTML/CSS基础知识(二)

    Q:HTML5是什么?为什么要用HTML5?有什么新特性?移除了哪些元素? HTML5是HTML的最新版本,2014年10月由万维网联盟(W3C)完成标准制定.目标是替换1999年制定的HTML4.0 ...

  8. 当一个HTML元素需要添加mouseon、mouseout与click事件,或者mouserenter、mouseleave和click事件时,click事件无法触发

    当一个HTML元素需要添加mouseon.mouseout与click事件,或者mouserenter.mouseleave和click事件时,click事件无法触发 针对上述问题,我遇到的有两种情况 ...

  9. linux如何复制文件夹和移动文件夹

    linux下文件的复制.移动与删除命令为:cp,mv,rm一.文件复制命令cp 命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)cp [option ...

  10. vue中.sync 修饰符

    一直以来,都不太明白.sync的用法,归根结底原因在于,没有仔细阅读“.sync修饰符”. 正好,最近在拿一个项目练手,然后使用了elment-ui,然后在用到dialog的时候,属性visible是 ...