一.学习JVM的好处
- 能够明白为什么Java最早期被称为解释型语言
- 为了今后更好的解决线上排查问题
- 可以通过调整JVM相关参数提高Java应用的性能
- 可以清楚知道Java程序是如何执行的
二.JVM体系结构图
三.类加载器ClassLoader
3.1类的加载、连接、初始化
先来探索一下一个类加载到JVM的一个基本结构:
class进入类加载器,加载初始化为类模板,实例化为一个个类的实例。
从代码来理解:
class Test{
public static int a = 1;
}//我们程序中给定的是 public static int a = 1;
//但是在加载过程中的步骤如下:
1. 加载阶段 编译文件为 .class文件,然后通过类加载,加载到JVM【查找并加载类的二进制数据】
2. 连接阶段
第一步(验证):确保Class类文件没问题 【确保被加载的类的正确性】
第二步(准备):先初始化为 a=0。(因为你int类型的初始值为0) 【为类的静态变量分配内存,并将其初始化为默认值】
第三步(解析):将引用转换为直接引用【把类中的符号引用转换为直接引用】
3. 初始化阶段: 通过此解析阶段,把1赋值为变量a
3.2类加载器的分类
- BootstrapClassLoader(根类加载器)sun.boot.class.path 加载系统的包,包行jdk核心库里的类
- ExtensionClassLoader(扩展类加载器)java.ext.dirs 加载扩展jar包中的类
- AppClassLoader(应用程序类加载器)java.class.path 加载你编写的类,编译后的类
- Java.long.ClassLoader的子类,用户可以定制类的加载方式
3.3双亲委派机制
双亲委派机制的工作原理:
一层一层的让父类去加载,最顶层的父类不能加载往下数,依次类推。
- 类加载器收到类加载的请求
- 把这个请求一直往上委托,直到根类加载器(启动加载器)
- 类加载器检查能不能加载,能就加载,否则通知子加载器进行加载
- 重复步骤三
public class ClassLoaderDemo {
public static void main(String[] args) {
System.out.println("ClassLodarDemo's ClassLoader is " +ClassLoaderDemo.class.getClassLoader());
System.out.println("The Parent of ClassLodarDemo's ClassLoader is " +
ClassLoaderDemo.class.getClassLoader().getParent());
System.out.println("The GrandParent of ClassLodarDemo's ClassLoader is " +
ClassLoaderDemo.class.getClassLoader().getParent().getParent());
}
}
ClassLodarDemo's ClassLoader is sun.misc.Launcher$AppClassLoader@18b4aac2
The Parent of ClassLodarDemo's ClassLoader is sun.misc.Launcher$ExtClassLoader@1b6d3586
The GrandParent of ClassLodarDemo's ClassLoader is null
好处:
-
保证了Java程序的文档运行,避免类的重复加载
-
保证了Java的核心API不被篡改
学习来自:B站-狂神说