JAVA面试核心知识点-JVM之类加载机制

在JVM的江湖里,类加载机制可以说是“武林秘籍”的封面章节。不搞懂它,你都不好意思说你会Java。今天我们就来聊聊——类,是怎么被JVM请上舞台、穿好衣服、化好妆,最后表演“面向对象”的好戏。

01

JVM里的招牌厨子:类加载器

Java程序跑起来前,类(.class文件)还只是硬盘上的一段死数据。要让它活起来,就得靠JVM里的大厨——类加载器(ClassLoader)来“炒菜上桌”。

类加载器不是一个,而是一大堆,个个身怀绝技,最出名的“三厨一保姆”如下:

  1. Bootstrap ClassLoader(引导类加载器)
    JVM亲儿子,地位尊贵,只加载核心类库(rt.jar里的东西),比如 java.lang.*
    俗称“祖师爷”级别的类加载器,连我们程序员都看不见它的影子。

  2. Extension ClassLoader(扩展类加载器)
    有点像“亲戚家孩子”,负责加载ext目录下的类库,不属于核心,但也不能没它。

  3. App ClassLoader(系统类加载器)
    咱们写的代码、依赖的第三方Jar,全靠它带飞。俗称“搬砖工”,干活最多。

  4. 自定义ClassLoader
    你要是嫌官方这几位不够香,可以自己写个“黑暗料理界”版本的加载器,造就一番奇迹(当然,调不好 JVM 会胃疼)。

02

类加载的七步曲:从文件到“真人秀”

JVM把类请进内存,一般分为以下几个流程,妥妥的“选秀综艺节目”:

  1. 加载(Loading):从硬盘读取 .class 文件,转成 Class 对象。
    👉 类比:演员报名,登记信息。

  2. 验证(Verification):检查这个类有没有非法指令,不能乱来。
    👉 类比:体检+政审。

  3. 准备(Preparation):给类变量(static变量)分配内存,初始化为默认值。
    👉 类比:发房卡,入住“类变量宿舍”。

  4. 解析(Resolution):将符号引用变成直接引用,准备现场连线。
    👉 类比:认亲戚,把“那个谁”变成“王叔叔”。

  5. 初始化(Initialization):真正执行类的<clinit>方法(静态代码块+静态变量初始化)。
    👉 类比:开机仪式,灯光音响全开。

  6. 使用(Using):类已经在舞台上表演,Ready Go!

  7. 卸载(Unloading):演出结束,资源释放,JVM内存回收。
    👉 类比:退房、退场、拜拜了您嘞。

03

双亲委派机制:谁先上场谁说了算

JVM有个规矩,加载类时不能“抢风头”,要先请长辈出场,这就是传说中的:

双亲委派模型(Parent Delegation Model)

通俗点讲:AppClassLoader要加载一个类时,先问它爹 ExtensionClassLoader,爹说我不会,它再问爷 BootstrapClassLoader。真到没人认识,才自己加载。

这么设计,是为了安全!比如如果你能自己写个 java.lang.String,那整个JVM都乱套了。

但万事皆有例外,比如你写了个自定义ClassLoader,不想按规矩来,可以打破“祖训”,实现破坏双亲委派(也就是“自立门户”)。

04

面试题时间:如何判断两个类是同一个类?

你可能以为只要类名相同就OK,太天真了!

在JVM眼里:

类是否相同 = 类的全限定名 + 加载它的类加载器是否相同

两个com.example.Hello,一个是AppClassLoader加载的,一个是你自定义的Loader加载的,Sorry,完全不同的“Hello”,连握手都不认识。

05

总结一口气

类加载机制这玩意儿,说简单也简单,说复杂也能绕你七个弯。最后用一句话总结:

“类加载器决定了你是谁,类的生命周期决定了你活多久,双亲委派决定了你听谁话。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值