java虚拟机类加载机制-java开发java经验技巧

java虚拟机类加载机制-java开发java经验技巧

ID:30769174

大小:94.45 KB

页数:9页

时间:2019-01-03

java虚拟机类加载机制-java开发java经验技巧_第1页
java虚拟机类加载机制-java开发java经验技巧_第2页
java虚拟机类加载机制-java开发java经验技巧_第3页
java虚拟机类加载机制-java开发java经验技巧_第4页
java虚拟机类加载机制-java开发java经验技巧_第5页
资源描述:

《java虚拟机类加载机制-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java虚拟机类加载机制-编程开发技术Java虚拟机类加载机制原文出处:朱小厮看到这个题目,很多人会觉得我写我的九腹代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的。随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性。闲话不多说,老规矩,先来一段代码吊吊胃口。publicclassSSClass{static{System.out.printin("SSClass");}}publicclassSuperclasscxtcndsSSClass{static{System,out.printin("SuperClassinit!〃);}pub

2、licstaticintvalue二123;publicSuperClass(){System,out.println(z/initSuperclass'7);}}publicclassSubClassextendsSuperClass{static{System,out.printin("Subclassinit");}staticinta;publicSubClass()System,out.println(,zinitSubClassz,);publicclassNotlnitialization{publicstaticvoidmain(String[]args){Sy

3、stem,out.printin(SubClass,value);}}运行结果:SSClassSuperClassinit!123答案答对了囉?也许有人会疑问:为什么没有输出SubClassinitook~解释一下:对于静态字段,只有直接定义这个字段的类才会被初始化,因此通过其了类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。上面就牵涉到了虚拟机类加载机制。如果有兴趣,可以继续看下去。类加载过程类从被加载到虚拟机内存屮开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)>验证(Verification)>准备(Preparation)、

4、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)?个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。如图所示。加载(Loading)验证(Verification)准备(Preparation)解析(Resolution)连接(Unking)卸载使用初始化(Unloading)V丿(Using)(Initialization)<丿丿加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这利帧序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段Z后再开始,这是

5、为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。以下陈述的内容都□HotSpot为基准。加载在加载阶段(口J以参考java.lang.ClassLoader的loadClassO方法),虚拟机需要完成以下3件事情:1.通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class文件中获取,可以从其他渠道,譬如:网络、动态生成、数据库等);2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;3.在内存中牛成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口;加载阶段和连接阶段(Linking)的部

6、分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段的开始吋间仍然保持着固定的先后顺序。验证验证是连接阶段的笫一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段大致会完成4个阶段的检验动作:1.文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以魔术OxCAFEBABE开头、主次版本号是否在肖前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。2.元数据验证:对字节码描述

7、的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除Tjava.lang.Object之外。3.字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。4.符号引用验证:确保解析动作能正确执行。验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数來关闭大部分的类验证措施,以缩短虚拟机类加载的时间。准备准备阶段是正式为类

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。