JVM类加载前因后果

前言:写这篇文章的目的在于解开对jvm类加载认知的一些疑惑!

  1. 类加载的入口是?或者说从那个类开始加载?
  2. 类被加载后,是加载到了哪里?
  3. 加载完成的标记是什么?什么时候类才能被正式引用到?
  4. 为什么要采用分层加载的机制?
  5. 自定义加载器中怎样在加载的时候引用到更高级别类加载器已加载的类?

那么此文将从5个方面来说明类加载的前因后果,解开上述的疑问!

  • why: 为什么要加载?
  • what: 加载什么?
  • who: 谁来加载?
  • when: 何时加载?
  • how:怎样加载?
why:为什么要加载?
类加载的目的在于将class格式的二进制文件加载至内存,转换成jvm能识别的数据结构。
what:加载什么?
符号jvm规范的class格式的二进制文件。
who:谁来加载?
classloader加载器!按照优先级高低依次分为:启动类加载器(bootstrap-classloader) > 扩展类加载器(extension-classloader)>应用程序类加载器(application-classloader)>自定义类加载器(user-classloader)
when:何时加载?
第一次引用时动态加载。具体包括:new实例化对象、静态类型变量或方法被引用、反射调用。
how:怎样加载?
加载、验证、准备、解析、初始化的步骤进行。
类加载的入口是?或者说从那个类开始加载?
待解答!
类被加载后,是加载到了哪里?
加载到jvm堆内存区,包括:常量池、方法区。
加载完成的标记是什么?什么时候类才能被正式引用到?
待解答!
为什么要采用分层加载的机制?
分层加载的机制保证了类的唯一性。例如:根类Object类,它必须保证系统中只有一个Object类且必须是jdk自带的那个,否则将导致程序的错误。如果应用程序自己定义了一个同名(含包路径)的类。加载的时候由于会逐层往上委托给更高级别的加载器加载(类加载的双亲委托机制),所以最后启动类加载器识别出它能加载此类。也就是最终读取的会是jdk自带的类,应用程序自己定义的同名类将永远不会被加载到!
自定义加载器中怎样在加载的时候引用到更高级别类加载器已加载的类?
待解答!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值