类加载机制

来源:互联网 发布:2017程序员笔记本推荐 编辑:程序博客网 时间:2024/06/04 01:15

SessionCookie的区别

Session:是在服务端保存的数据结构,用来跟踪用户的状态,这个数据可以保存在集群,数据库,文件中

Cookie:是客户端保存用户信息的一种机制用来记录用户的信息,也是Session的一种方式。

JVM

虚拟机的类加载机制

1.概念:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析,初始化,最终成被虚拟机直接使用的java类型。

2.类加载的时机

 程序运行期间完成,提高java程序运行的灵活性,java的动态扩展的语言

特性就是依赖运行期动态加载和动态链接这个特点实现的。

 比如:编写一个面向接口的程序,运行期间在指定到他的实现类,也就是可以让一个本地的运行程序可以在运行的时候从网络或者其他地方加载一个二进制流作为程序代码的一部分。

类加载的时机:从被加载到虚拟内存开始,到卸载出内存为止,生命周期包括:加载,验证,准备,解析 [三个属于连接阶段]初始化,使用,卸载[这无五个顺序必须是确定]

3.类加载 由虚拟机的具体实现

4.初始化的条件(对类的主动引用):A、使用new关键字

                B、读取或者设置一个类的静态字段,以及调用静态方法的时候

                C、对类进行反射调用的时候

                D、初始化一个类发现父亲类没有初始化

                E、虚拟机启动的时候会初始化这个主类

5.加载阶段A、通过一个类的全限定名来获取定义此类的二进制字节流

            B、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

            C、在内存中生成一个代表这个类的对象,作为方法区的这个类的各种数据的访问入口。

 非数组类的加载是可控的:系统提供的引导类类加载器来完成,用户自定义的类加载器

 数组类:由JVM自己直接创建,数组元素类型最终靠类加载器完成。

)加载阶段完成之后,虚拟机外部的二进制字节流安照虚拟机需要的格式存储在方法区之中,方法区存储数据的格式由虚拟机实现自行定义,在内存中实例化对象(未规定是在java堆中,对于HotSpot虚拟机而言,class对象比较特殊,虽然是对象但是存放在方法区中)

加载阶段和连接阶段的部分内容是交叉进行的,但他们的开始时间依旧保持着固定的先后顺序。

6. 验证阶段

   却保Class文件(不仅仅是从java源码来的)的字节流中包含的信息是符合当前虚拟机要求的,并且不会危害虚拟机自身的安全

(1)文件格式验证

     保证输入的字节流能正确的解析并存储于方法区之内,格式上符合描述一个java类型信息的要求。基于二进制字节流进行验证

(2)元数据验证

   对字节码描述的信息进行语义分析,也就是说对类的元数据信息进行语义校验,保证不存在不符合java规范的元数据信息。

(3)字节码验证

通过数据流和控制流分析确定语义是合法的,符合逻辑的,此阶段是对类的发那个方法体进行校验,保证被校验类的方法在运行时不会对虚拟机造成危害事件。

(1)符号引用验证

虚拟机将符号引用转化为直接引用的时候,这个转化动作将在连接的第三阶段也就是解析阶段发生。

此过程可以看做是对类自身以外的信息进行匹配性校验。从而确保解析动作能够正常进行运行。(重要但是不必要)

(注:在实施阶段使用-Xverify:none参数来关闭大部分的类的验证措施,来缩短类加载的时间)

 

7. 准备阶段

正式的为类变量分配内存并设置类变量初始值的阶段,这些变量使用的内存都将在方法区中分配,对象分配内存是在堆中进行分配。

Public static int value=123;

次过程之后value=0;编译之后是123

但是,Public static  final int value=123; 直接赋值为123

8. 解析

解析阶段是虚拟机将常量池的符号引用替换为直接引用的过程。

直接引用和符号引用:

符号引用:用一组符号来描述所引用的目标

直接引用:直接引用可以是直接指向目标的指针,相对偏移量,一个可以间接定位到目标的句柄。

解析动作主要针对类,接口,字段,类方法,接口方法,方法句柄,调用点限定符7类符号进行引用。

具体和初始化下文会继续

《后续》

原创粉丝点击