目录
1. JVM类加载器
1.1. 类加载器的过程
加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
1.1.1. 加载
class文件中的 main 方法开始加载,用到哪些类,就加载哪些类。
执行 Student.class 中的 main方法
1.1.2. 验证
Java虚拟机规范验证 class 是否符合规范。
验证 Student.class 是否符合Java虚拟机规范,防止恶心篡改。
1.1.3. 准备
给类和划分内存空间,给变量初始化值。
Student student = new Student();
给 student 划分内存空间,并且给student初始化值 Student student = null;
1.1.4. 解析
把符号引用替换成直接引用。
// TODO
1.1.5. 初始化
真正执行引用对象的实例化。
如果对象有父对象,先初始化父对象。
初始化对象 student = new Student();
如果 Student extends Person,那么先初始化 Person;
2. 类加载器和双亲委派机制
2.1. 类加载器有哪些
(1)核心类加载器(Boostrap ClassLoader):负责加载JDK核心类 lib;
(2)扩展类加载器(Extension ClassLoader):负责加载JDK扩展类 lib\ext;
(3)应用程序加载器(Application ClassLoader):负责加载 ClassPath 环境变量所指定的路径中的类(可以理解为项目中所需的第三方Jar);
(4)自定义类加载器:可以自己定义加载器;
(5)双亲委派类加载器:
如果应用程序中依赖了某个类,它不会先去找自己的应用程序中有没有这个类,会让自己的爹(扩展类加载器)帮他找;而扩展类加载器也不会先去找自己有没有,它也会让自己的爹(核心类加载器)去找。核心类没爹了,自己就是祖宗,找了半天,发现没有。
典型的靠爹,自己不想动手的人
优势:避免多层级的加载器结构重复加载某些类。
3. 内存区域
3.1. 方法区
存放类文件、常量
JDK1.8以前叫做方法区,JDK1.8后改为 MetaSpace
3.2. 程序计数器
执行代码指令,java文件编译之后是 class,下图就是一张 class 的内容,其中 0:aload_0 是字节码指令,程序如何执行及执行顺序就是程序计数器。
总结:程序计数器就是记录当前执行的字节码指令的位置,即当前之前到哪一条字节码指令了。每个线程都有自己的程序计数器。
3.3. 栈
存放常量。
每一个方法会有一个栈帧会存放到当前线程的虚拟机栈中。
特点:后进先出。
3.4. 堆
实例化的对象。
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。