jvm-类加载系统

类加载系统

文章目录

什么是类加载系统

字节码存储在硬盘上需要运行时,由类加载系统负责将类的信息加载到内存中,为每个类创建一个class对象,使用ClassLoader进行加载。

类加载过程

1.加载

将硬盘字节码文件读到内存中,生成此类的class对象,把硬盘上的结构转为内存结构

2.链接

验证:验证字节码格式,是否被修改

​ 验证语法,例如类是否继承final的类

准备:在准备阶段为类中静态变量赋予初始值,在准备阶段不为静态的常量进行赋值

解析:将符号引用(文件中的逻辑引用)转为直接引用(内存中的实际地址)

3.初始化

对静态成员变量进行赋值

类什么时候初始化

(1)创建类的实例,也就是 new 一个对象

(2)访问某个类或接口的静态变量,或者对该静态变量赋值

(3)调用类的静态方法

(4)反射(Class.forName(“”))

(5)初始化一个类的子类(会首先初始化子类的父类)

类加载器

负责加载类的类

类加载器的分类

jvm角度分:

1.启动类加载器(引导类加载器),这部分不是用java语言写的

2.其他类加载器,这部分是用java语言写的类加载器

从程序员角度分:

1.启动类加载器,负责加载java核心类

2.扩展类加载器,负责加载\jre\lib\ext目录下的类,包含应用程序类加载器

3.应用程序类加载器,负责加载自己写的程序中的类

类何时加载

主动使用

将类加载的整个过程完成

(1)通过new关键字被导致类的初始化

(2)访问类的静态变量,包括读取和更新

(3)访问类的静态方法

(4)对某个类进行反射操作,会导致类的初始化

(5)初始化子类会导致父类的的初始化

(6)执行该类的 main 函数

被动使用

不会加载初始化

(1)访问类中的静态常量

(2)将类作为类型,例如创建数组用类作为类型

Dog[] dogs = new Dog[10] ;
  • 1

主动使用和被动使用的区别在于类是否会被初始化

双亲委派机制

为了确保类加载的正确性、安全性,在类加载时,采用双亲委派机制;

当需要加载程序中一个类时,会先让类加载器的父级去加载,直到最顶级的启动器类加载器;

如果父级找到了返回使用,如果依然没找到就委派给子级去加载,找到了就返回;

如果所有类加载器都没找到,报类找不到异常。

**优点:**安全,避免了自己写的类替换了系统中的类,避免类重复加载。

如何打破双亲委派机制

java中提供了一个ClassLoader类,定义哪些方法加载类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值