类加载器介绍

类加载器介绍

类加载子系统只负责从文件系统中加载class文件,class文件在文件开头有特定的文件标识;
ClassLoader主要负责class文件的加载,是否运行则由Execution Engine决定;
加载的类信息放在一块为方法区的内存空间,其还会存放运行时常量池信息,可能还包括字符串字面量和数字常量

类加载过程一:加载(Loading)

1、通过类的全限定名获取定义此类的二进制字节流
2、将字节流所代表的的静态存储结构转换为方法区的运行时数据结构
3、在内存中生成一个代表这个类的java.class.Class对象,作为方法区这个类的访问入口

类加载过程二:链接(Linking)

验证(Verify)

确保Class文件的字节流中包含信息符合虚拟机要求,保证被加载类的安全性,不会危害虚拟机自身安全,验证class文件是否一CAFEBABE开头;

准备(Prepare)

对类变量进行默认初始化,即赋默认值,并分配在方法区中;
被final修饰的static不会赋值,因为已经在编译时分配了;
实例变量也不会初始化,而是随着对象分配在内存中;

解析(Resolve)

将常量池内的符号引用转换为直接引用的过程;

类加载过程三:初始化(Initializztion)

执行类构造器方法()的过程,该方法不等同与类的构造器,是javac编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并而来。该方法中指令按语句在源文件中出现的顺序执行;
静态->非静态->构造方法
执行子类的()之前会先执行父类的()方法;
虚拟机必须保证一个类的方法在多线程下被同步加锁。

类加载器分类

主要分为两类:引导类加载器(Bootstrap Classloader)和自定义类加载器(User-Defined ClassLoader);
将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器;
常见的类加载器3个:启动类加载器,扩展类加载器,系统类加载器;
系统类加载器用来加载我们自定义的类;
java的核心类库使用启动类加载进行加载;

启动类加载器

用C C++实现,嵌套在JVM内部;
加载java核心类库(jre/lib/rt.jar、resources.jar、sun.boot.class.path),用于提供jvm自身所需的类;
没有父加载器;

扩展类加载器

java语言编写;派生于ClassLoader类;从java.ext.dirs系统属性所指定的jre/lib/ext子目录下加载类库,如果用户创建的jar包放在改目录,也会由扩展类加载器加载

系统类加载器

java语言编写;派生于ClassLoader类;
用来加载用户自定义的类,是程序的默认类加载器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值