JVM-类加载

Java程序启动时将,字节码(.class) 文件读入到内存中去, 类加载就是针对这一过程而言的

读入内存主要分为三个过程: 加载, 链接, 初始化


加载

加载指的是:JVM找到字节码(.class) 文件, 然后打开文件, 读文件, 创建类对象


链接

链接又分为三个步骤: 验证, 准备, 解析

  1. 验证:  指的是JVM检查字节码文件是否符合JVM规范书中的规范
  2. 准备: 指的是为静态变量分配内存空间
  3. 解析: 把字符串常量初始化, 符号引用替换为直接引用----(意思是在编译过程中, JVM将字符串常量用一些特殊符号代替, 当真正进行类加载时, 把字符串常量真正放入对应的内存地址中替换为刚才的占位符)

初始化

类加载过程中的最后一个阶段,便是标记为常量值的字段赋值,以及执行<clinit>方法的过程

java虚拟机会通过加锁来确保类的<clinit>方法仅被执行一次

只有当初始化完成之后,类才正式成为可执行的状态


双亲委派模型---(面试常考)

描述的问题是类加载时,在加载文件阶段,去哪些目录下查找字节码(.class) 文件

用到JVM中类加载器这一特殊模块

类加载器有JVM中自带的, 也可以自己定义创建

多数情况都是JVM自带的三个类加载器来系统完成工作, 各自负责扫描对应的目录

  1. BootStrap ClassLoder(启动类加载器) ---- 主要是加载标准库中的类, eg:java.lang.String..
  2. Extension ClassLoder(扩展类加载器) ----- 扫描加载扩展的类
  3. Application ClassLoder(应用程序类加载器) ---- 加载第三方类和应用程序中自己定义的类

JVM对这三个类加载器约定了父子关系

BootStrap ClassLoder > Extension ClassLoder > Application ClassLoder

工作路径: 比如要加载一个java.lang.String类, JVM会先启动 Application ClassLoder 但不会扫描它自己的类,而是启动他的父亲 Extension ClassLoder 同样也不会扫描, 启动它的父亲 BootStrap ClassLoder, 因为它本身没有父亲所以会扫描自己的标准库类,找到再加载; 当加载一个自定义的类时, 同样先从入口 Application ClassLoder 进入, 经过 Extension ClassLoder 到达 BootStrap ClassLoder 然后再依次向下扫描, 直到在应用程序类中找到; 当找不到时则会报错: ClassNotFoundException

当自己定义创建一个类加载器时可以遵守双亲委派这个模型,也可以不遵守,由自己决定这个类加载器使用的方式

双亲委派模型的意义(目的):

为了防止程序员自己写一个特殊的类,而把标准库中的类给覆盖

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值