前因后果"/>
JVM类加载前因后果
前言:写这篇文章的目的在于解开对jvm类加载认知的一些疑惑!
- 类加载的入口是?或者说从那个类开始加载?
- 类被加载后,是加载到了哪里?
- 加载完成的标记是什么?什么时候类才能被正式引用到?
- 为什么要采用分层加载的机制?
- 自定义加载器中怎样在加载的时候引用到更高级别类加载器已加载的类?
那么此文将从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自带的类,应用程序自己定义的同名类将永远不会被加载到!
自定义加载器中怎样在加载的时候引用到更高级别类加载器已加载的类?
待解答!
更多推荐
JVM类加载前因后果
发布评论