详解Class加载过程01

Class Loading Linking Initalizing

      简单说上次讲到了class文件的格式,这次讲的是class文件怎么放进内存的。
      class 文件怎么进入到内存有三大步。
1.第一大步叫Loading
2.第二大步叫Linking
       linking又分为三小步,第一小步verfication,第二小步preparation,第三小步resolution
3.第三大步叫Initlalizing
首先来看看Loading的过程,解释下每一步是什么意思
      首先Loading,是把一个class文件load内存装载到内存里面去,他本来是class文件上的一个一个的二进制,一个一个的字节,装完之后就是接下来Linking。
Linking的过程分为三小步
(1).verification是校验装进来的class文件是不是符合class文件的标准。
(2).preparation是把class文件静态变量赋默认值,不是赋初始值。
(3)resolution是把class文件常量池里面用到的符号引用,要给它转换为直接内存地址,直接可以访问到的内容。
Initlalizing指的是静态变量这时候赋值才成为初始值。


类加载器.png

如上图所示类加载器,首先第一点jvm本身有一个类加载器的层次,这个类加载器本身就是一个普通的class,jvm有一个类加载器的层次分别来加载不同的class,jvm所有的class都是被类加载器加载到内存的,那么这个类加载器可以叫做classloader。
每一个class在java虚拟机里面到内存里面任何一个class都是被classloader内存的,那么这个classloader其实就是顶级一个父类,这个父类叫做classloader,他是一个abstract抽象类,相当于这个类被领到内存里面去了,他一定是classloader这个类的子类,如果想知道class是被谁弄到内存里面去的,其实很简单,就是下面这段代码
System.out.println(String.class.getClassLoader());
第一个类加载器层次
类加载的加载过程,加载过程是分成不同的层次来加载,不同的类加载器来加载不同的class,最顶层的是Bootstrap
第二个类加载器层次
这个是Extension加载器拓展类,加载拓展包里的各种各样文件,这些拓展包在jdk安装目录jre/lib/ext下的jar
第三个类加载器层次
这个就是平时用的加载器application,它用于加载classpath指定的内容
第四个类加载器层次
这个就是自定义加载器classloader,加载自己有定义的加载器
CustomClassLoader父类加载器是>application父类加载器是>Extension父类加载器是>Boostrap,
且其他不是继承,不要混淆.
这里就会引出双亲委派机制,这也是类加载器面试题必问的问题,下一章节在自习讲解吧

你可能感兴趣的:(详解Class加载过程01)