JAVA之了解类加载器Classloader
来源:互联网 发布:炫踪网络出的游戏 编辑:程序博客网 时间:2024/03/28 22:37
1、类的加载、连接和初始化
类初始化通常包括加载、连接、初始化三个步骤。
(1)进程的结束
每当运行一个java程序时,将会启动一个java虚拟机进程,不管程序多么复杂,有多少线程,都在这个java虚拟机进程里。以下四种情况会使得该进程被终止——
- 程序运行到最后正常结束;
- 程序里遭遇了System.exit(),或者是Runtime.getRunTime().exit()代码;
- 程序执行中遇到了未捕获的异常或者错误;
- java所在平台强制结束了JVM进程;
当该进程结束,那么该进程在内存中的状态将会丢失,包括静态变量的值。
(2)类的加载
类的加载是指将类的class文件读入内存,并为之创建一个java.lang.class对象。
(3)类的连接
类的连接负责把类的二进制数据合并到JRE中,分为三个阶段——
- 验证:检验被加载的类是否有正确的内部结构;
- 准备:负责为类的静态Field分配内存,并设置默认初始值;
- 解析:将类的二进制数据中的符号应用替换成直接引用。
(4)类的初始化
类的初始化,主要就是对静态Field进行初始化。
2、类加载器
(1)类加载器简介
类加载器负责加载所有的类,系统为所有载入内存里的类都会生成一个java.lang.class对象;
同一个类只会被加载一次,在JVM中每一个不同的类都会有一个不同的类加载器负责。
类加载器在不包括用户自定义的加载器的情况下包括三层:
- Bootstrap Classloader根加载器;
- ExtensionClassloader扩展类加载器;
- System ClassLoader系统类加载器;
①根加载器,又称为引导或者原始加载器,负责加载java的核心类;
②扩展类加载器,负责加载JRE的扩展目录中JAR包的类;
③系统类加载器,又称为应用加载器,负责JVM启动时加载来自java命令的-classpath或者CLASSPATH环境变量所指定的JAR包和类路径。一般是程序运行的当前路径。所以其称为应用类加载器。
三个类加载器的顺序是:
bootstrap classloader
|
extension classloader
|
system classloader
如果有用户自定义的类加载器,那么在系统加载器后,将会执行用户类加载器。
(2)自定义类加载器
如果我们需要在启动类加载时作一些特定需求的行为,那么就需要自定义类加载器了。
自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。
主要可以扩展的方法有:
findClass 定义查找Class的方式
defineClass 将类文件字节码加载为jvm中的class
findResource 定义查找资源的方式
(3)类加载机制
JVM的类加载机制有以下三种:
- 全盘负责:
所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。
- 父类委托:
所谓父类委托,就是先让父类加载器先尝试加载该Class,当父类无法加载的时候,才是尝试从自己的类路径中去加载。JVM的ClassLoader采用的是树形结构,除了BootstrapClassLoader以外,每个ClassLoader都会有一个parentClassLoader,即父类加载器,用户自定义的ClassLoader默认的parendClassLoader是SystemClassLoader,当然你可以自己指定需要用哪一个ClassLoader的实例
- 缓存机制:
所谓缓存机制就是保证所有加载过的类都会被缓存,当程序中需要某个类时,会先从缓存区中搜查该类,当缓存区不存在该类对象时,系统才会读取该类的二进制文件。
- JAVA之了解类加载器Classloader
- java面试之ClassLoader类加载器
- java类加载器classLoader
- Java ClassLoader 类加载器
- java类加载器ClassLoader .
- java类加载器classloader
- Java ClassLoader 类加载器
- Java类加载器 ClassLoader
- java ClassLoader类加载器
- 深入分析Java ClassLoader原理(面试问题:你了解java类加载器么)
- Java类加载器的原理之classLoader 体系结构
- Java之四:类的加载器ClassLoader
- java学习之深入类加载器--ClassLoader
- Java类加载机制ClassLoader之ContextClassLoader
- Java类加载/ClassLoader
- Java 类加载Classloader
- Java类加载ClassLoader
- JAVA ClassLoader加载类
- 利用addr2line来定位问题
- iOS并发编程指南--Dispatch Sources
- 天行健,君子自强不息
- Lucene原理与代码分析
- 新生代垃圾回收
- JAVA之了解类加载器Classloader
- printf与++的puzzle
- 开源中最好的Web开发的资源
- Zigbee基础实验——可变内存空间的串口通讯
- 在Fedora15编译PC版的qtopia的总结
- php分页类-不必改动就可以用的php分页类
- The Dirichlet Distribution 狄利克雷分布 (PRML 2.2.1)
- 资源共享
- android模拟器