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

java学习笔记之类加载器

2016-06-11 10:23 337 查看
虽然学习java也有一年多了,对java的运用可以算作熟练,但深入到java的执行过程,就一年茫然了,所以买了一本《JVM高级虚拟机》。结合网上找的关于类加载机制,谈谈自己的收获吧。

JVM三种预定义类型类加载器

我们首先看一下 JVM预定义的三种类型类加载器,当一个 JVM 启动的时候, Java 缺省开始使用如下三种类型类装入器:

启动( Bootstrap )类加载器 :引导类装入器是用本地代码实现的类装入器,它负责将 /lib 下面的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

标准扩展( Extension )类加载器 :扩展类加载器是由 Sun 的 ExtClassLoader( sun.misc.Launcher$ExtClassLoader) 实现的。它负责将 < Java_Runtime_Home >/lib/ext (JRE中)或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

系统( System )类加载器 :系统类加载器是由 Sun 的 AppClassLoader( sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径( CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

除了以上列举的三种类加载器,还有一种比较特殊的类型就是线程上下文类加载器

ClassLoader 的常用方法



JVM在加载类时默认采用的是双亲委派 机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载 。

LoadClass 中 loadClass()源码解析

public Class<?> loadClass(String name)throws ClassNotFoundException {

return loadClass(name, false);

}

protected synchronized Class<?> loadClass(String name, boolean resolve)

throws ClassNotFoundException {

// 首先判断该类型是否已经被加载

Class c = findLoadedClass(name);

if (c == null) {

//如果没有被加载,就委托给父类加载或者委派给启动类加载器加载

try {

if (parent != null) {

//如果存在父类加载器,就委派给父类加载器加载

c = parent.loadClass(name, false);

} else {

//如果不存在父类加载器,就检查是否是由启动类加载器加载的类,通过调用本地方法native Class findBootstrapClass(String name)

c = findBootstrapClass0(name);

}

} catch (ClassNotFoundException e) {
// 如果父类加载器和启动类加载器都不能完成加载任务,才调用自身的加载功能
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;

}


有关ClassLoader还有很重要一点:

同一个ClassLoader加载的类文件,只有一个Class实例。但是,如果同一个类文件被不同的ClassLoader载入,则会有两份不同的ClassLoader实例(前提是着两个类加载器不能用相同的父类加载器)。

类加载的一般过程

一、简单过程

Java程序运行的场所是内存,当在命令行下执行:

java HelloWorld

命令的时候,JVM会将HelloWorld.class加载到内存中,并形成一个Class的对象HelloWorld.class。

其中的过程就是类加载过程:

1、寻找jre目录,寻找jvm.dll,并初始化JVM;

2、产生一个Bootstrap Loader(启动类加载器);

3、Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。

4、Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader。

5、最后由AppClass Loader加载HelloWorld类。

以上就是类加载的最一般的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jvm bootstrap 虚拟机