您的位置:首页 > 编程语言 > Java开发

深入理解Java中类加载的流程和机制

2017-06-13 16:05 239 查看
首先让我们连接类加载器的种类和作用:

引导类加载器:(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.csdn.net/article/details?id=50529868
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: