JAVA之了解类加载器Classloader

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

时间: 2024-10-08 00:18:00

JAVA之了解类加载器Classloader的相关文章

java中的类加载器ClassLoader和类初始化

每个类编译后产生一个Class对象,存储在.class文件中,JVM使用类加载器(Class Loader)来加载类的字节码文件(.class),类加载器实质上是一条类加载器链,一般的,我们只会用到一个原生的类加载器AppClassLoader,它只加载Java API等可信类,通常只是在本地磁盘中加载,这些类一般就够我们使用了.如果我们需要从远程网络或数据库中下载.class字节码文件,那就需要我们来挂载额外的类加载器. 一般来说,类加载器是按照树形的层次结构组织的,每个加载器都有一个父类加载

java类加载器——ClassLoader

Java的设计初衷是主要面向嵌入式领域,对于自定义的一些类,考虑使用依需求加载原则,即在程序使用到时才加载类,节省内存消耗,这时即可通过类加载器来动态加载. 如果你平时只是做web开发,那应该很少会跟类加载器打交道,但如果你想深入学习tomcat服务器的架构,它是必不可少的.所谓类加载器,就是用于加载Java类到Java虚拟机中,它负责读取Java字节码,并转换成java.lang.Class类的一个实例,使字节代码.class文件得以运行.一般类加载器负责根据一个指定的类找到对应的字节代码,然

浅析java类加载器ClassLoader

作为一枚java猿,了解类加载器是有必要的,无论是针对面试还是自我学习. 本文从JDK提供的ClassLoader.委托模型以及如何编写自定义的ClassLoader三方面对ClassLoader做一个简要的总结. JDK中提供的ClassLoader 1. Bootstrap ClassLoader Bootstrap加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类,是最顶

深入理解 java类加载器ClassLoader

类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()方法就可以创建出该类的一个对象,也就是万能的Class对象. Jav

java的类加载器ClassLoader

类在执行之前会执行三个步骤:加载 ->   连接  -> 初始化 1.java中类的加载 java 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个Class对象,用来封装类在方法区的数据结构.可以把堆区的Class理解为方法区的一面镜子,对应方法区的类的数据结构,通过这面镜子实现类的调用. 加载.class文件的多种方式: 1.从本地系统中直接加载 2.通过网络下载.class文件 3.从zip,jar里加载.class文件

Java类加载器( CLassLoader ) 死磕 3: 揭秘 ClassLoader抽象基类

[正文]Java类加载器(  CLassLoader ) 死磕3:  揭秘 ClassLoader抽象基类 3.1. 揭秘ClassLoader抽象基类 3.1.1. 类的加载分类:隐式加载和显示加载 java中类是动态加载的,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载.一是加快启动的速度,二是节约内存.如果一次性加载全部jar包的所有class,速度会很慢. 动态载入一个class类,有两种方式: (1) implicit隐式加载 即通过实例化才载入的特性来

【正文】Java类加载器( CLassLoader ) 死磕 4: 神秘的双亲委托机制

[正文]Java类加载器(  CLassLoader ) 死磕4:  神秘的双亲委托机制 本小节目录 4.1. 每个类加载器都有一个parent父加载器 4.2. 类加载器之间的层次关系 4.3. 类的加载次序 4.4 双亲委托机制原理与沙箱机制 4.5. forName方法和loadClass方法的关系 4.6. 使用组合而不用继承 4.7. 各种不同的类加载途径 4.1.每个类加载器都有一个parent父加载器 每个类加载器都有一个parent父加载器,比如加载SystemConfig.cl

jvm之java类加载机制和类加载器(ClassLoader)的详解

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化. 一.类加载过程 1.加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象. 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是前面所有程序运行的基础

Java中的类加载器

转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制 我们知道,Java是一种动态语言.那么怎样理解这个"动态"呢?或者说一门语言具备了什么特性,才能称之为动态语言呢?对于java,我是这样理解的. 我们都知道JVM(java虚拟机)执行的不是本地机器码指令,而是执行一种称之为字节码的指令(存在于class文件中).这就要求虚拟机在真正执行字节码之前,先把相关的class文件加载到内存