JVM类加载器

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/ ]

本文链接地址: http://www.loserzhao.com/java/jvm-class-loader.html

文章的脚注信息由WordPress的wp-posturl插件自动生成

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

使用新浪微博登陆