深入理解Java中类加载的流程和机制
首先让我们连接类加载器的种类和作用:
引导类加载器:(Bootstrap ClassLoader),使用c++编写的,将一些必须系统类(位于{JAVA_HOME/lib下的jar包})加入到内存的方法区中,由于该加载器是由c++实现的,java代码不能访问,但是我们可以查询某各类是否被引导类加载器加载过,如:java.lang.Object,java.lang.Class,java.lang.System 等等
拓展类加载器:(Extension ClassLoader),用于加载java的扩展类的(位于{JAVA_HOME/lib/ext/下的jar包}),用来提供出系统类之外的其他服务,它是java中访问的最高的类加载器,即超级父类加载 拓展类没有父类
应用类加载器:(Application ClassLoader):用于加载用户自己编写的类
用户自定义类加载器:(必须继承java.lang.ClassLoader)用户自己编写定义的类加载器
类加载器之间的关系:
执行一个程序的流程:
1.根据jvm内存配置,获取内存
2.通过引导类加载器,将必须要的系统类加载进JVM中的方法区中
3.创建jvm启动器实例Launcher(是单列模式,一个jvm只有一个启动器),获得类加载器ClassLoader
4.加载我们自己定义的类
5.jvm从自定义的类的main方法开始执行
6.程序执行完,jvm自动销毁
class的类加载流程
应用类加载器要加载某个类,先判断它是否已经加载,是--->返回Class<T>实例,如果没有--->委托拓展类加载器加载,如果加载--->返回Class<T>实例,不在加载范围,返回null,--->然后,去查询类是否被引导类加载器加载,是--->返回Class<T>实例,没有---->应用类加载器自己加载,加载成功---->返回Class<T>实例,没有---->返回ClassNotFoundException异常
加载图:
内存中的存储管理:
参考:http://m.blog.****.net/article/details?id=50529868