您的位置 首页 java

JVM之谈一下Java的类加载机制

上篇文章我们谈到了,让一个Java项目运行起来,分三步:编译–>加载–>运行。JVM是通过类加载器把字节码加载到内存中来的,那类加载器是怎么工作的呢?我们一起来梳理下。

大家想过没有,JVM在什么样的情况下会去加载一个类呢?答案就是啥时候用到,啥时候就加载。那加载的过程又是怎样的呢?总共分以下几步:

1.加载

2.验证 验证的是加载的字节码是否符合Java虚拟机规范,如果被人恶意篡改过,JVM根本就 无法运行这个类。

3.准备 加载的类是需要占内存空间的,这一步就是给加载的类分配内存空间,并给类变量一 个初始值,如User对象中有一个年龄的类变量age,这个时候age的值会初始化为0.

4.解析 将常量池中的符号引用替换成直接引用。这个部分的内容比较复杂,涉及到很多底层 原理,大家先了解到这里就可以了。

5.初始化 为类的 静态变量 赋初始值,如一个类中有如下的静态变量 private static String ROLE = “admin”,这个admin的值就是在这个时候初始化的。需要注意的是ROLE 这 个类变量,在准备阶段是会被赋予一个null的初始值。

6.使用

7.卸载 一个类什么时候会被卸载呢?先说结论:

(1)这个类没有任何的实例对象存活

(2)加载这个类的类加载器被卸载了

加载过程如下图:

接下来,我们再看一下有哪几种类加载器。

类加载器有以下几种:

1.启动类加载器 Bootstrap ClassLoader,它负责加载Java的核心类,就是在Java按照目录lib下的类。JVM一启动就会加载。

2.扩展类加载器 Extension ClassLoader,它负责加载的是Java安装目录下的libext下的类。

JVM一启动也会加载。

3.应用程序类加载器 Application ClassLoader,它负责加载我们项目中ClassPath下的类。

4.自定义类加载器 如果有一些特殊的类加载需求,可以自己去实现一个类加载器。

面试中经常问的一个问题是,JVM类加载的机制是什么呢?答案就是 双亲委派机制

类加载器是有层级的,如下图:

双亲委派机制可以这么理解:当一个类加载器需要加载一个类的时候,它自己先不加载,而是会委派给自己的父类去加载,这个父类收到请求也不会直接加载,它也会把加载请求委派给它的父类,这样加载请求就会一直传递到最顶层的类加载器。这个时候这个最顶层的类加载器会在自己的加载范围内搜索这个类,如果有就加载,如果没有这个类的话,它机会把加载的权利下推给自己的子类加载器。这个子类加载器也会在自己的加载范围内找这个类,如果找到就加载,找不到的话就接着下推。

是不是感觉有点绕,大家对着图,多读几遍就理解了。这样设计的好处是什么呢?这样的话,是可以避免一个类被重复加载的。

好了,今天就到这里啦!

文章来源:智云一二三科技

文章标题:JVM之谈一下Java的类加载机制

文章地址:https://www.zhihuclub.com/195144.shtml

关于作者: 智云科技

热门文章

网站地图