虚拟机类加载机制(类加载过程)

加载过程

接下来我们详细讲解一下加我群里一中类加载的全过程,也就是加载,验证,准备解析和初始化这五个阶段所执行的具体动作。

加载

加载是类加载过程的一个阶段,希望读者没有混淆。这两个看起来好像是的名词,在家找阶段虚拟机需要完成下面三件事。
1.通过一个类的全限定名来获取定义此类的二进制字节流。
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3.在内存中生成一个代表这个类。的对象作为方法区这个类的各种数据的访问入口
虚拟机规范的这三点要求其实并不算具体,因此虚拟机实现与具体应用的灵活度。都是相当大的,例如通过一个类的全限定名来。获取定义此类的二进制字节流这条它并没有指定二进制字节流。一定要从一个class文件中获取,准确的说是根本没有指定从哪里获取,怎样获取。虚拟机设计团队在加载阶段。搭建了一个相当开放广阔的舞台,Java发展历程中,充分创造力的开发人员则在这个舞台上玩出了各种花样。举足轻重的Java技术都建立在这一基础之上,例如,
1)从zip包中读取这种很常见,最终日后的炸ear。war格式的基础
2)从网络中获取这种场景,最典型的就是applied
3)运行时计算生成这种场景使用的最多的就是动态代理技术。在java.lang.reflect.proxy中,就是使用了Process generator店generator proxy class。来为特定接口生成显示为$ proxy代理类的二进制字节流。
4)有其他文件产生。典型的应用就是JSP应用,既有这次文件上传对应的class类。
5)从数据库中读取这种场景相对少见,例如有些中间件服务器。可以选择把应用程序安装到数据库中来完成程序代码。在集群间的发放。

相当于类加载过程的其他阶段,一个非数组类的加载阶段,准确的说是加载阶段中获取类的二进制。自己留的动作是开发人员可控性最强的,因为加载阶段既可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器去完成。开发人员可以通过自定义的类加载器去控制自己留的获取方式。G重写一个类加载器的load class方法。
对数组类而言,情况就有所不同,数组类本身不通过类加载器创建,它是由加瓦虚拟机直接创建的,但数组类与类加载器仍然有很密切的关系,因为数组类的元素类型。指的是数组,去掉所有维度的类型,最终是要考虑加载器去创建。一个数组类创建过程就要遵循以下原则。
1)如果数组的组件类型是引用类型,那就要递归采用绑结。中定义的加载过程去加载这个组件类型。数组c将在加载该组建类型的类加载器的。那名空间上被标识
2)如果数组的组件类型不是引用类型千瓦虚拟监会把数组c标记为与引导类加载器关联。
3)数组类型的可见心与他的组件类型的可见性一致,如果组件类型不是引用类型那出组的。类的可见性被默认为public。

加载阶段完成好后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中。方法句中的数据存储格式由虚拟机实现自新定义。胸肌规范,未规定此区域的具体数据结构,然后在内存中实例化一个java.lang.class类的对象。并没有明确规定是在Java堆中。对于hot stop虚拟机而言,Class对象比较特殊,它虽然是对象,但是存储在方法区里面。这个对象将作为程序访问方法区中的这些类型数据的外部接口。加载阶段与链接阶段的部分内容是交叉进行的。加载阶段尚未完成,链接阶段可能已经开始,但这些加载加载阶段之中进行的动作仍然属于链接阶段的内容,这两个阶段的开始时间仍然保持着固定的先后顺序。

猜你喜欢

转载自blog.csdn.net/weixin_39472101/article/details/110152048