黑马程序员技术交流社区

标题: JVM加载class [打印本页]

作者: 张忠豹    时间: 2012-9-22 16:35
标题: JVM加载class
那位大侠可以详细的描述一下JVM加载class文件的原理机制?
作者: 明光照    时间: 2012-9-22 16:44
Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 Class 和接口 Implements 编译成单独的一个 . class 文件,这些文件对于 Java 运行环境来说就是一个个可以动态加载的单元。正是因为 Java 的这种特性,我们可以在不重新编译其它代码的情况下,只编译需要修改的单元,并把修改文件编译后的 . class 文件放到 Java 的路径当中, 等到下次该 Java 虚拟机器重新激活时,这个逻辑上的 Java 应用程序就会因为加载了新修改的 .class 文件,自己的功能也做了更新,这就是 Java 的动态性。

下面用一个简单的例子让大家对 Java 的动态加载有一个基本的认识:

class TestClassA{

public void method(){

   System.out.println("Loading ClassA");

}

}

public class ClassLoaderTest {

public static void main(String args[]){

   TestClassA testClassA = new TestClassA();

   testClassA.method();

}

}

编译后输入命令: java -verbose:class ClassLoaderTest ,执行文件。

输出结构如图 (1)


图( 1 )

从运行结果我们可以看到, JRE ( JavaRuntime Environment )首先加载 ClassLoaderTest 文件,然后再加载 TestClassA 文件,从而实现了动态加载。

   

Java 运行环境为了优化系统,提高程序的执行速度,在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载( pre-loading )的方法全部加载要内存当中,因为这些单元在 Java 程序运行的过程当中经常要使用的,主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。

当 java.exe 虚拟机开始运行以后,它会找到安装在机器上的 JRE 环境,然后把控制权交给 JRE , JRE 的类加载器会将 lib 目录下的 rt.jar 基础类别文件库加载进内存,这些文件是 Java 程序执行所必须的,所以系统在开始就将这些文件加载,避免以后的多次 IO 操作,从而提高程序执行效率。

作者: 尤圣回    时间: 2012-9-22 17:59
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析
    装载:查找和导入类或接口的二进制数据;
    链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
    校验:检查导入类或接口的二进制数据的正确性;
         准备:给类的静态变量分配并初始化存储空间;
         解析:将符号引用转成直接引用;
初始化:激活类的静态变量,初始化Java代码和静态Java代码块
作者: 尤圣回    时间: 2012-9-22 17:59
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析
    装载:查找和导入类或接口的二进制数据;
    链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
    校验:检查导入类或接口的二进制数据的正确性;
         准备:给类的静态变量分配并初始化存储空间;
         解析:将符号引用转成直接引用;
初始化:激活类的静态变量,初始化Java代码和静态Java代码块
作者: 孙岳    时间: 2012-9-22 18:07
类通过JVM的classloader加载到内存,分为3个步骤:加载,连接,初始化。
加载:查找并加载类的二进制数据,.class文件,从硬盘拷贝到内存。
连接:分为3个阶段。
         1)验证加载的字节码文件是否正确。
                 2)为静态变量分配内存,并初始化默认值。
                 3)把类中的符号引用转换成直接引用。
初始化:真正的初始化。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2