一、JVM架构
二、字节码文件
2.1前端编译器
前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVM探范的字节码文件。javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤,分别是词法解析、语法解析、语义解析以及生成字节码。
2.1.1 javac(IDEA默认使用的)
javac是一种能够将Java源码编译为字节码的前端编译器
2.1.2 ECJ编译器
在Java的前端编译器领域,除了javac之外,还有一种被大家经常用到的前端编译器,那就是内置在Eclipse中的EC(Eclipse Compiler for Java)编译器。和Javac的全量式编译不同,ECJ是一种增量式编译器。
Class的对象
(1) class:
外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
( 2) interface:接口
(3)[]:数组
(4) enum:枚举
(5) annotation:注解@interface
(6) primitive type:基本数据类型
( 7) void
i++的过程
bipush 10 将10放入操作数栈
istore_1 将栈中值放入局部变量表下标为1的位置
iload_1 将局部变量表中的值放入栈中
iinc 1 by 1 将局部变量表中的值加1
istore_1 将栈中的值放入局部变量表中
static void test2(){
Integer a = 128;
Integer b = 128;
log.info("输出的结果为{}",a == b);
}
class文件的组成部分(16进制)
进制在线转换
https://www.sojson.com/hexconvert.html
魔数
Class文件版本
常量池
访问标识(或标志)
类索引,父类索引,接口索引集合
字段表集合
方法表集合
属性表集合
常量池
常量池:可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型(后面的很多数据类型都会指向此处),也是占用Class文件空间最大的数据项目之一。
常量池表项中,用于存放编译时期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
字面量:1.文本字符串 2.声明为final的常量值
符号引用: 1.类和接口的全限定名 2.字段的名称和描述符 3.方法的名称和描述符
常量类型和结构
常量池中每一项常量都是一个表,JDK1.7之后共有14种不同的表结构数据。如下表格所示:
|