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

Java类加载机制

2016-06-16 11:44 302 查看


Java类加载机制

JVM

同一个JVM中所有的线程,变量都同处一个进程

终止JVM进程的方法

程序运行正常结束

程序运行时使用了System.exit()或者Runtime.getRuntime().exit()直接关闭虚拟机

程序执行遇到未捕获的异常或错误

程序所在平台强制关闭JVM进程

类初始化的时机

创建某个类的实例

new

通过反射来创建实例

通过反序列化来创建实例

调用某个类的静态方法

访问某个类的静态变量

通过反射的方法强制为某个类或接口创建相应的Class对象

初始化某个类的子类

直接使用exe命令来运行某个主类

类加载

概念

程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化这三个步骤对该类进行初始化,JVM会连续执行这三个过程,所以也将这三个过程统称为类加载

类的加载

概念

将类的.class文件读到内存,并为之建立一个java.lang.Class对象

类加载器

JVM提供的类加载器

开发者通过继承ClassLoader基类自定义类加载器

从不同的来源加载类的二进制数据

本地文件系统

JAR包

网络

动态编译一个Java源文件,并执行加载

类加载器通常无需等到首次使用某个类时才加载这个类,虚拟机规范允许系统预先加载某个类

类的连接

概念

类加载之后系统为之生成了对应的Class对象,接着进入连接阶段,连接阶段负责把类的二进制文件合并到JRE中

连接阶段的三个阶段

验证

验证该类是否有正确的内部结构,并和其他类协调一致

准备

为类变量分配内存,并设置初始值

解析

将类的二进制数据中的符号引用转换成直接引用

类的初始化

概念

在初始化阶段,虚拟机负责对类进行初始化,主要就是初始化类变量

Java类中对类变量进行初始化的俩种方法

声明变量时制定初始值

使用静态初始化块

JVM初始化一个类的步骤

如果该类没有被加载和连接,那么闲加载并连接该类

如果该类的父类还没有被初始化,先初始化该类的父类

系统以此执行初始化语句

宏变量

静态变量

final修饰

编译时就可以确定值

类加载

概念

程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化这三个步骤对该类进行初始化,JVM会连续执行这三个过程,所以也将这三个过程统称为类加载

类的加载

概念

将类的.class文件读到内存,并为之建立一个java.lang.Class对象

类加载器

JVM提供的类加载器

开发者通过继承ClassLoader基类自定义类加载器

从不同的来源加载类的二进制数据

本地文件系统

JAR包

网络

动态编译一个Java源文件,并执行加载

类加载器通常无需等到首次使用某个类时才加载这个类,虚拟机规范允许系统预先加载某个类

类的连接

概念

类加载之后系统为之生成了对应的Class对象,接着进入连接阶段,连接阶段负责把类的二进制文件合并到JRE中

连接阶段的三个阶段

验证

验证该类是否有正确的内部结构,并和其他类协调一致

准备

为类变量分配内存,并设置初始值

解析

将类的二进制数据中的符号引用转换成直接引用

类的初始化

概念

在初始化阶段,虚拟机负责对类进行初始化,主要就是初始化类变量

Java类中对类变量进行初始化的俩种方法

声明变量时制定初始值

使用静态初始化块

JVM初始化一个类的步骤

如果该类没有被加载和连接,那么闲加载并连接该类

如果该类的父类还没有被初始化,先初始化该类的父类

系统以此执行初始化语句

宏变量

静态变量

final修饰

编译时就可以确定值

JVM

同一个JVM中所有的线程,变量都同处一个进程

终止JVM进程的方法

程序运行正常结束

程序运行时使用了System.exit()或者Runtime.getRuntime().exit()直接关闭虚拟机

程序执行遇到未捕获的异常或错误

程序所在平台强制关闭JVM进程

类初始化的时机

创建某个类的实例

new

通过反射来创建实例

通过反序列化来创建实例

调用某个类的静态方法

访问某个类的静态变量

通过反射的方法强制为某个类或接口创建相应的Class对象

初始化某个类的子类

直接使用exe命令来运行某个主类

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2)ExtensionClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中class

4)CustomClassLoader

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从CustomClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jvm 类加载