JVM工作过程(一):类加载机制

什么是类加载?
  类加载是程序主动使用某个类的时候,这个类还没有被加载到内存中,那么JVM会通过加载(Loading)、链接(tLinking)、初始化(Initialization)三个步骤对类进行初始化。因此把这三个步骤统称为类加载或类的初始化。
在这里插入图片描述
类加载的详细过程
在这里插入图片描述加载器加载到JVM中,接下来分为几个步骤:
1、加载:查找并加载类的二进制数据,将类的class 文件读入到内存中,在Java堆中也创建一个java.lang.Class类的对象。
2、链接:包含三块内容:
 1)验证:文件格式,元数据,字节码,符号引用验证。验证的目的在于确保Class文件的字节流中包含信息符合当前虚拟机的要求,不会危害虚拟机的安全。
 2)准备:为类的静态变量分配内存,并将其初始化为默认值。 3)解析:把类中的符号引用转换为直接引用。
3、初始化:为类的静态变量赋予正确的初始值。

类加载的时机
主动初始化的6种方式:
1、创建对象实例:new对象的时候,会对类的初始化,前提这个类没有被初始化。
2、调用类的静态属性或为静态属性赋值。
3、调用类的静态方法。
4、通过class文件反射创建对象。
5、初始化一个类的子类:使用子类的时候先初始化父类。
6、Java虚拟机启动时被标记为启动类的类:比如main方法所在的类。
不会进行初始化的情况:
1、在同一个类加载器下面只能初始化类一次如果已经初始化了就不必要初始化了。
2、在编译的时候能确定下来的静态变量(编译常量),不会对类进行初始化。如final修饰的静态变量。

类加载器
  类加载器负责加载所有的类,为所有被载入内存中的类生成一个java.lang.Class实例对象。在同一个类加载器下面只能初始化类一次,一旦这个类被加载如JVM中,同一个类就不会被再次载入。
  JVM预定义有三种类加载器,当一个 JVM启动的时候,Java开始使用如下三种类加载器:
1)启动类加载器(Bootstrap ClassLoader):
  启动类加载器一般称为顶层的类加载器,用来加载Java的核心类,是用原生代码来实现的。负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类。
2)扩展类加载器(ExtClassLoader):
  负责加载Java平台中扩展功能的一些jar包,包括lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。
3)应用类加载器(AppClassLoader):
  负责加载classpath中指定的jar包及目录中的class。
双亲委派模型
在这里插入图片描述
双亲委派模型工作过程:
  当前类加载器从自己已经加载的类中查询此类是否已经加载,如果已经加载,返回原来已经加载的类,如果没有找到,则委托父类加载器加载,如果父类加载器还存在其父类加载器,则依次递归,直到委托到启动类加载器为止。如果父类加载器为空,就代表使用启动类加载器作为父类加载器去加载该类。如果启动类加载器加载失败,就会使用扩展类加载器来尝试加载,继续失败则会使用AppClassLoader来加载,继续失败就会抛出一个异常ClassNotFoundExceotion.
双亲委派模型优点:
1、安全性:Java核心API中定义类型不会被随意篡改,避免用户自己编写的类动态替换Java的一些核心类。
2、避免类的重复加载:Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,相同的class文件被不同的类加载器加载得到的结果就是两个不同的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值