1.什么时候加载类?
2.加载类有哪些过程?
3.类加载的详细过程。
4.双亲委派机制。
我们清楚的一个前提是,编写的源文件.java最后要编译成.class才能被运行。总的来说,一个类,最后会被编译成一个class文件。JVM加载和执行的是class文件。
1.什么时候加载类?
我们的类是存放在硬盘上的,什么时候JVM会将编写好的类加载进去JVM内存去执行呢?一般来说,是在代码用使用这个类的时候,JVM才会将.class文件加载进去JVM内存中。
例如有一个Test类,使用jar命令编译后,再使用jar命令执行这个Test.class文件的时候。JVM启动的时候就会加载这个Test类,并且从main方法开始执行。
image.png这个类稍微改一下,如下图:
image.png
main方法还会使用到Demo这个类,那么在执行new Demo()之前,就会加载Demo这个类进JVM的内存。
类加载到使用到使用完毕会经过7个过程:
加载 -》验证 -》 准备-》解析-》初始化-》使用-》卸载
-
加载
类加载器,将二进制字节码文件加载入JVM的过程。由于JVM没有限定用什么方式加载,可以加载生成好的本地文件,可以从网络加载,甚至可以动态生成一个字节码文件。 -
验证
加载字节码文件后,需要进行验证,防止加载的文件是非法文件,或者是损害JVM的文件。 -
准备
准备阶段中,会为类和类变量(static修饰的变量)分配内存空间,赋予初始值(0值)。 如果类变量是常量的话,则直接赋常量值。 -
解析
将字符引用解析为直接引用的过程。非常复杂。 -
初始化
这个阶段,会执行类的静态代码块和对类变量(static修饰的变量)进行赋值,赋予代码设定的值,如果值是调用一个方法产生,则会执行这个方法。 -
使用
进行实例化,方法调用,等等。 -
卸载
就类从永久代/元数据空间清除,这个要求比较苛刻。
以上是关于整个类加载的过程的简易总结,详细过程如下:
- 加载
- 双亲委派机制。
加载类有多个,并且有层级关系。 最顶层的是Bootstrap ClassLoader(启动加载器),负责加载Java的最基础的类库。 然后是Extension ClassLoader(扩展加载器),负责加载lib/ext下的类库。然后是Application ClassLoader(应用程序加载器) ,负责加载编写好的classPath路径下的类库。
还有自定义的类加载器。 自定义的加载器,在应用程序加载器的下一层。
双亲委派机制的意思是,加载器首先让父类去加载,如果父类加载不了,才用子类去加载。
那么,加载的顺序是,应用程序加载器,请求扩展加载器去加载,扩展加载器请求启动加载器去加载,启动加载器加载不了,则加载这个会回到扩展类加载器,扩展加载器也加载不了,才让应用程序加载器去加载。
同一个类,被同一个加载器加载,才算是同一个类。 双亲委派机制,可以保证,同一个类,被同一个加载器加载。
网友评论