一、引言
Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部门的过程。
二、Java虚拟机的类装载完成与应用
2.1 装载过程简介
在Java中,类装载器把一个类装入Java虚拟机中,要经由三个步调来完成:装载、链接和初始化,其中链接又能够分为校验、预备和解析三步,除了解析外,其它步调是严厉依照递次完成的,各个步调的首要工作如下:
装载:查找和导入类或接口的二进制数据;
校验:搜检导入类或接口的二进制数据的准确性;
预备:给类的静态变量分派并初始化存储空间;
解析:将符号援用转成直接援用;
初始化:激活类的静态变量和静态Java代码块。
java虚拟机使用每一个类的第一件事情就是将该类的字节码装载进来,装载类字节码的功能是由类装载器完成的,类装载器负责根据一个类的名称来定位和生成类的字节码数据后返回给java虚拟机。最常见的类加载器是将要加载的类名转换成一个.class文件名,然后从文件系统中找到该文件并读取其中的内容,这种类装载器也不是直接将.class文件中的内容原封不动地返回给java虚拟机,它需要将.class文件中的内容转换成Java虚拟机使用的类字节码,譬如,Java程序中的字符串编译成.class文件后是以UTF-8编码存在的,而装载进java 虚拟机后要被转换成Unicode编码。
类加载的时候遵循一个原则:“类加载器会依类的继承体系从上至下依次加载”。举个例子:“如果C继承了B并实现了接口I,而B有继承自A”,则类加载器在加载C时,加载的次序会是A>B>I>C,(注:interface会如同class一样被Java编译器编译为独立的.class文件)
2.2 装载的完成
JVM中类的装载是由ClassLoader和它的子类SecureClassLoader来完成的,Java ClassLoader 是一个主要的Java运转时系统组件。它担任在运转时查找和装入类文件的类。在Java中,ClassLoader是一个抽象类,它在包java.lang中。
JVM在运行时会产生三个ClassLoader:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap是用C++编写的,我们在Java中看不到它,是null,是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。
AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。
系统为什么要分别指定这么多的ClassLoader类呢?
答案在于因为java是动态加载类的,这样的话,可以节省内存,用到什么加载什么,就是这个道理,然而系统在运行的时候并不知道我们这个应用与需要加载些什么类,那么,就采用这种逐级加载的方式
(1)首先加载核心API,让系统最基本的运行起来
(2)加载扩展类
(3)加载用户自定义的类
2.3 装载的应用
普通来说,我们利用虚拟机的类装载时需要继承抽象类java.lang.ClassLoader,并重写loadClass()。下面我们举例申明它的应用。
public abstract class MultiClassLoader extends ClassLoader{
...
public synchronized Class loadClass(String s, boolean flag)throws ClassNotFoundException
{
/* 搜检类s能否曾经在当地内存*/
Class class1 = (Class)classes.get(s);
/* 类s曾经在当地内存*/
if(class1 != null) return class1;
/*用默许的ClassLoader 装入类*/
try {
class1 = super.findSystemClass(s);
return class1;
}
catch(ClassNotFoundException _ex) {
System.out.println(">> Not a system class.");
}
/* 获得类s的字节数组*/
byte abyte0[] = loadClassBytes(s);
if(abyte0 == null) throw new ClassNotFoundException();
/* 将类字节数组转换为类*/
class1 = defineClass(null, abyte0, 0, abyte0.length);
if(class1 == null) throw new ClassFormatError();
if(flag) resolveClass(class1); /*解析类*/
/* 将新加载的类放入当地内存*/
classes.put(s, class1);
System.out.println(">> Returning newly loaded class.");
/* 返回已装载、解析的类*/
return class1;
}
...
}
分享到:
相关推荐
Java虚拟机类装载:原理、实现与应用.doc
简单的介绍和描述Java虚拟机类装载:原理、实现与应用
现在很多JAVA程序员,都只是知道用JAVA,而不知道它的原理实现,深入Java虚拟机,有助于了解Java虚拟机类装载:原理、实现与应用
详细描述java虚拟机内部加载类机制和原理
本文从对嵌入式操作系统的讨论入手,结合Java虚拟机的原理和研究状况阐述了YJVM的设计和实现要点,体现了YJVM相比现有的嵌入式Java解决方案和Java操作系统的优势。本文的主要研究内容及成果包括: 1、作为一种...
Java 类的动态装载机制是Java 虚拟机的一项核心技术,可以在运行时刻...介绍了Java 虚拟机中类的动态装载机制的原理、实现 及应用,分析了类装载器的结构、用途,阐述了利用自定义类装载器装载并执行Java 类的过程。
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 1说说JVM原理?内存泄露与溢出区别,何时产生内存泄露? 编译源代码为...
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 1说说JVM原理?内存泄露与溢出区别,何时产生内存泄露? 编译源代码为...
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...
学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置PATH环境变量 10 学生提问:为什么选择设置用户变量,用户变量和系统变量有...
类装载 class装载流程 ClassLoader模式 ClassLoader的使用实例分析 热替换例子 详细介绍ClassLoader的原理和应用。分析2个案例,说明ClassLoader的使用。 第七课 性能监控工具 线程死锁分析 OOM分析 介绍常用的JVM...