1.什么是JVM
1.1 JVM解释
JVM是 Java Virtual Machine (Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引用地址:https://baike.baidu.com/item/JVM
1.2 JVM 架构图
2. 源码 -> 类文件
2.1 源码
class Person{
private String name;
private int age;
private static String address;
private final static String hobby="Programming";
public void say(){
System.out.println("person say...");
}
public int calc(int op1,int op2){
return op1+op2;
}
}
编译: javac Person.java —> Person.class
2.2 编译阶段
Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器
-> 注解抽象语法树 -> 字节码生成器 -> Person.class文件
2.3 类文件
- 官网地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1
- .class 字节码文件
魔数与class文件版本
常量池
访问标志
类索引、
父类索引、
接口索引
字段表集合
方法表集合
属性表集合
3. 类加载机制
3.1 加载
-
查找和导入 .Class 文件
1.根据类的全限定名转化为二进制字节流
2.将二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在Java堆中生成一个代表这个类的
java.lang.Class
对象,作为对方法区中这些数据的访问入口
3.2 链接
3.2.1 验证
保证被加载类的正确性
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
3.2.2 准备
为类的静态变量分配内存,并初始化为默认值
public class Test{
//初始化 a = 0;
private static int a = 1;
// 初始化 obj = null;
private static Object obj = new Object();
}
3.2.3 解析
将符号引用转换为直接引用
3.3 初始化
将类的静态变量,静态代码块 执行初始化操作
- 例如:将 a 的值 赋值 为 1;
public class Test{
private static int a = 1;
static{
System.out.println("初始化静态块");
}
}
3.4 类加载器ClassLoader
3.4.1 类加载器类型
- Bootstrap ClassLoader 负责加载
$JAVA_HOME
中jre/lib/rt.jar
里所有的class 或 Xbootclassoath 选项制定的jar包。由c++实现,不是ClassLoader
子类 - Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括
$JAVA_HOME
中jre/lib/*.jar
或-Djava.ext.dirs
指定目录下的jar 包 - App ClassLoader 负责加载
classpath
中指定的jar包以及Djava.class.path
所指定目录下的类和jar包 - Custom ClassLoader 通过 java.lang.ClassLoader 的子类自定义加载class,属于应用程序根据自身需要自定义的ClassLoader, 如 tomcat , jboss 都会根据 j2ee规范自行实现了 ClassLoader.
3.4.2 加载原则
- 加载类的顺序 从上到下
- 检查某个类是否加载顺序是 从下到上,保证一个类自加载一次
- 双亲委派机制
- 一个类加载器在接到加载类的请求的时候,首先他不会加载,他会委托给父类加载器,依次递归,如果父类加载器可以加载,就会完成加载工作并成功返回。如果父类完成不了,才自己加载。
- 优势:实现类加载的分层,结构清晰,更是为了安全。
- 破坏: 可以 继承ClassLoader 类,重写 loadClass 方法;