学习自:哔哩哔哩尚硅谷
Java语言:跨平台的语言
字节码文件的跨平台性
Java虚拟机:跨语言的平台
想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码
字节码文件里是什么?
什么是字节码指令(byte code)?
Class类的本质:
Class文件格式:
Class文件的总体结构:
1、Magic Number(魔数)
2、Class文件的版本号
3、常量池:存放所有常量
3.1、常量池计数器(constant_pool_count)
3.2、常量池表(constant_pool)
常量类型和结构:
5、类索引,父类索引,接口索引集合
7、方法表集合
8、属性表集合
1、解析字节码的作用:
2、javac -g操作:
3、javap的用法
1、创建指令:
2、字段访问指令:
3、数组操作指令:
4、类型检查指令:
1、条件跳转指令:
2、比较条件跳转指令
3、多条件分支跳转
4、无条件跳转指令
java虚拟机支持两种同步结构:方法级的同步 和 方法内部一段指令序列的同步,这两种同步都是使用monitor来支持的
从java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载
按照java虚拟机规范,从class文件到加载内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:
从程序中类的使用过程看:
一些相关的面试题:
1、加载完成的操作:
2、二进制流的获取方式:
3、类模型与Class实例的位置:
外部可以通过访问代表Order类的Class对象来获取Order的类数据结构
4、数组类的加载:
1、验证阶段:
当类加载到系统后,就开始链接操作,验证是链接操作的第一步
它的目的是保证加载的字节码是合法、合理并符合规范的
注意:如果使用字面量的方式定义一个字符串常量的话,也是在解析环节直接进行显式赋值。
3、解析阶段:
在准备阶段完成后,就进入了解析阶段
解析阶段,简言之,将类、接口、字段和方法的符号引用转为直接引用
1、static 与 final 的搭配问题:
初始化阶段,简言之,为类的静态变量赋予正确的初始值
static final
修饰,则显式赋值(直接赋值常量,而非调用方法)通常是在链接阶段的准备环节进行String
来说,如果使用字面量的方式赋值,使用 static final 修饰的话,则显式赋值通常是在链接阶段的准备环节进行在初始化阶段
中赋值情况:
最终结论:
static final
修饰,且显示赋值中不涉及到方法或构造器调用的基本数据类型或String
类型的显示赋值,是在链接阶段的准备环节进行2、
的线程安全性:
3、类的初始化情况:主动使用vs被动使用:
类加载器是JVM执行类加载机制的前提
1、面试题:
什么是双亲委派机制?优点是什么?讲一下双亲委派机制
2、类加载的分类:
3、类加载器的必要性:
4、类加载器的命名空间:
5、类加载机制的基本特征:
JVM支持两种类型的类加载器:
引导类加载器(启动类加载器):
扩展类加载器:
应用程序类加载器(系统类加载器):
用户自定义类加载器:
每个Class对象都包含一个定义它的ClassLoader的一个引用。
Class.forName()与ClassLoader.loadClass()
:
1、定义与本质:
2、双亲委派机制的优势与劣势:
破坏双亲委派机制1:
破坏双亲委派机制2:线程上下文加载器
破坏双亲委派机制3:
热替换的实现:
沙箱安全机制