接地气的方式认识JVM(二)
最近实习,感觉属于自己的时间越来越少了,这次来一起说说jvm的类加载器吧。
类加载器
他是干什么的?
类加载器是用来将.class文件搬运到内存中的,并将这些内容转换成方法区运行时的数据结构,并且ClassLoader只负责class文件的加载,而是否能运行则有Execution Engine来决定。
1.1类加载器的流程
加载器的流程包括:加载、链接、初始化
再具体一点就是:加载,验证,准备,解析,初始化,使用,卸载
其中验证,准备,解析都属于链接
1.1.1加载
1.将.class文件加载到内存中去
2.将静态的数据结构转化成方法区运行时的数据结构
3.在堆上生成一个代表这个类的java.lang.Class文件对象作为数据的入口
1.1.2链接
1.验证:对类做一个安全检查,防止这个文件会对jvm做一些攻击的事情
2.准备:为static变量在方法区中分配内存方法,设置变量的初始值,例如 static int a=3
3.解析:虚拟机将常量池内的符号引用替换为直接引用的过程(从import java.util…这算法号引用,直接引用就是指针或者对象地址
1.1.3初始化
初始化其实就是执行类构造器方法的()的过程,而且要保证执行前父类的()方法执行完毕。这个方法由编译器收集,顺序执行所有类变量(static 修饰的成员变量)显式初始化和静态代码块中语句。此时准备阶段时的那个 static int a 由默认初始化的 0 变成了显式初始化的 3。
1.1.4卸载
GC将无用对象从内存中卸载
1.2类加载器的加载顺序
加载一个类是有优先级的
1.BootStrap ClassLoader rt.jar
2.Extension ClassLoader 加载拓展的jar包
3.App ClassLoader 指定classpath下的jar包
4.Custom ClassLoader 自定义的类加载器
1.3双亲委派机制
当一个类收到了加载请求时,它是不会自己进行加载的,而是委托给父类去完成,比如说我现在要new一个Student类,这个Student类是我们自定义的类,Student类会先去委托App ClassLoader类,然后,App ClassLoader类会去委托Extension ClassLoader类,然后会去BootStrap类中去加载,只有当父类中都找不到这个类时,才回去当前类进行加载
这样做的好处是,在加载rt.jar包中的类时,不管是哪一个类加载器,最终都会委托到BootStrap类进行加载,这样保证了使用的不同的类加载器,加载的结果是一致的
over!