我为什么喜欢Java,另一个重要原因就是跨平台,WORA。

  程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机。   

♣Tip

  其实这里存在两种无关性,一是平台无关性、另一个是语言无关性。通过向不同的硬件平台和操作系统提供

不同的JVM实现上层应用和底层平台之间的解耦;另一个,JVM生态系统中有多种语言如Scala、Groovy和Jruby,

它们通过编译生成统一的字节码来实现互操作,达到了语言无关性的目的,这样各个语言可以在各自擅长的领域发挥作用。

  概括了一下字节码文件的特点:

    (1)以字节(8bit)为最小单位进行存储。意思就是,任意取<8bit的内容,没有意义。

    (2)排列紧凑。中间没有一个空格或分隔符。

    (3)一个类对应一个.class文件。注意,不是一个.java文件对应一个.class,内部类的.class前会有个主类名+$符。

  那么字节码的构成是什么样的呢?

  看起来很像通讯协议的报文,毕竟它们都是一种字节流。实际上其本质可以理解为编译器和JVM之间的一种通讯协议。

一、字节码文件的构成

1、魔数与版本

  每个.class文件都是以CAFEBABE四个字节开始,它的作用就是标识这个文件是.class文件。

  第5到第8这四个字节是.class文件的版本号。Java的策略是向下兼容,就是高版本的虚拟机可以跑低版本的字节码。反过来的话,加载验证的时候就会出错。

2、常量池(Constant Pool)

  池是个形象的说法。包含字面量(literal)和符号引用(Symbolic References)。常量数目是不固定的,所以常量池区域在字节码文件中以常量计数器开始。

    ①字面量可以认为是Java中的常量,包括字符串、final常量。

    ②符号引用包括,类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。

  需要指出的是,常量的表示很复杂,每种常量都用自己独特的数据结构来表达。  

♣字节码分析工具javap

  查看x.class文件中的常量池可以用命令:

    javap -verbose x。

3、访问标识(access_flag)

  访问标识长度为两个字节(16位),其中8位已被定义。它主要用来表示类或接口的属性等信息(如public、abstract、final等)。

4、类索引(this_class)、父类索引(super_class)及接口索引(interfaces)集合

  用来确定类的继承和实现关系。

5、字段表集合(field_info)

  描述类或接口中定义的字段。

6、方法表集合

7、属性表集合(attribute_info)

  每个类、字段、方法需要用自己特有的数据结构来表示,这种数据结构就是属性表。

  另外,字节码指令跟汇编指令一样,也由操作码(opcode)和操作数(operands)构成。

  ①数据类型

    有意思的是操作码助记符包含了其操作数的数据类型,如iload表示加载int型数据到操作数栈,fload则表示加载float型数据。

  ②指令类型

    Ⅰ.包括加载*load、存储*store、运算*add。

    Ⅱ.类型转换指令。Java默认支持小->大的转换,如int->long,这个无需指令。但是大到小则需要转换指令如,i2b表示int转byte,并且会丢失精度。

    Ⅲ.对象创建与访问。new创建对象,newarray创建数组。

     Ⅳ.操作数栈管理。如pop将操作数顶出栈,。

     Ⅴ.控制转移指令。ifeq如果等于、iflt如果大于、tableswitch复合条件分支、goto跳转。

     Ⅵ.方法访问和返回。invokevirtual调用对象的实例方法、invokestatic调用对象的静态方法

     Ⅶ.异常处理指令。athrow。

         Ⅷ.同步指令。monitorenter和monitorexit两条指令用来支持synchronized关键字。

【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构的更多相关文章

  1. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  2. 【Java】「深入理解Java虚拟机」学习笔记(5)- 类加载

    C/C++在编译时需要进行连接,而Java的类加载.连接和初始化是在运行时完成的. 图  类的生命周期 图中解析的过程不一定在准备和初始化之间,也可以在初始化之后再开始,以支持Java的运行时动态绑定 ...

  3. 【Java】「深入理解Java虚拟机」学习笔记(2)- JVM内存区域

    一.运行时数据区 JVM在执行Java程序的时候,将其运行时数据区划分为若干不同区域.它们的用途和创建及销毁的时间不同. 1.程序计数器(Program Counter Register) 是一块很小 ...

  4. 《深入理解 Java 虚拟机》读书笔记:类文件结构

    正文 一.无关性的基石 1.两种无关性 平台无关性: Java 程序的运行不受计算机平台的限制,"一次编写,到处运行". 语言无关性: Java 虚拟机只与 Class 文件关联, ...

  5. 「中国剩余定理CRT」学习笔记

    设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...

  6. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

  7. Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)

    Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达 ...

  8. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

  9. 《深入理解 Java 虚拟机》学习笔记 -- 内存区域

    <深入理解 Java 虚拟机>学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分: 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 如图所示: 1. 程序计数器(线程私有 ...

随机推荐

  1. Coursera, Machine Learning, notes

      Basic theory (i) Supervised learning (parametric/non-parametric algorithms, support vector machine ...

  2. MFCC/Filter Bank的提取流程

    预加重:通过一个一阶有限激励响应高通滤波器,使信号的频谱变得平坦,不易受到有限字长效应的影响. 分帧:根据语音的短时平稳特性,语音可以以帧为单位进行处理,实验中选取的语音帧长为32ms,帧移为16ms ...

  3. Python 爬虫六 性能相关

    前面已经讲过了爬虫的两大基础模块: requests模块:用来伪造请求爬取数据 bs4模块:用来整理,提取数据 当我们真正的开始有需求的时候通常都是批量爬取url这样的.那如何批量爬取呢? 按照正常的 ...

  4. python中重要的模块--asyncio 转载

    转载自: https://www.cnblogs.com/zhaof/p/8490045.html 一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python ...

  5. typecho只能打开主页,文章详细内容打不开

    安装环境: nginx+linux 问题描述: 安装了typecho显示成功安装,但是前端只显示标题和摘要,点击查看不了详细内容. 问题原因: PHP这块不支持pathinfo, 官网提供的解决方案有 ...

  6. const的引用

    const的引用 对常量的引用:把引用绑定到const对象上,就像绑定到其他对象上一样,不能被用作修改它所绑定的对象: ; const int &r1 = ci;//正确:引用及其对应的对象都 ...

  7. Django 学习手册 - 下载数据库表格(XLS/CSV)

    下载XLS表格方式: 前置: 需要安装xlwt模块 views : def export_users_xls(request): response = HttpResponse(content_typ ...

  8. 20165337学习基础和C语言基础调查

    20165337学习基础和C语言基础调查 你有什么技能比大多人(超过90%以上)更好? 讲道理我感觉我自己没有什么能比90%以上的人都做得好的技能,我就瘸子里面拔将军挑一个我自认为还不错的技能吧. 我 ...

  9. 生产环境使用 pt-table-checksum 检查MySQL数据一致性【转】

    公司数据中心从托管机房迁移到阿里云,需要对mysql迁移(Replication)后的数据一致性进行校验,但又不能对生产环境使用造成影响,pt-table-checksum 成为了绝佳也是唯一的检查工 ...

  10. C++ 读取字符串中的数字

    今天真是试了各种方法,笨方法聪明方法都有了 方法1:一个字符一个字符的读取 方法2:借助strtok实现split 适用于char 方法3:借助istringstream实现split 适用于stri ...