当前位置: 首页 > news >正文

邢台移动网站建设价格郴州建设工程建设信息网站

邢台移动网站建设价格,郴州建设工程建设信息网站,大型门户网站建设,青州网站建设qzfuwu深入理解Java虚拟机#xff1a;JVM高级特性与最佳实践-总结-7 类文件结构概述无关性的基石 虚拟机类加载机制概述类加载的时机 类文件结构 代码编译的结果从本地机器码转变为字节码#xff0c;是存储格式发展的一小步#xff0c;却是编程语言发展的一大步 概述 我们写的程… 深入理解Java虚拟机JVM高级特性与最佳实践-总结-7 类文件结构概述无关性的基石 虚拟机类加载机制概述类加载的时机 类文件结构 代码编译的结果从本地机器码转变为字节码是存储格式发展的一小步却是编程语言发展的一大步 概述 我们写的程序需要被编译器翻译成由0和1构成的二进制格式才能被计算机执行。如今的计算机仍然只能识别0和1但由于最近十年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展把我们编写的程序编译成二进制本地机器码Native Code已不再是唯一的选择越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。 无关性的基石 如果全世界所有计算机的指令集就只有x86一种操作系统就只有Windows一种那也许就不会有Java语言的出现。Java在刚刚诞生之时曾经提出过一个非常著名的宣传口号 “一次编写到处运行Write OnceRun Anywhere”各种不同的硬件体系结构、各种不同的操作系统肯定将会长期并存发展。“与平台无关”的理想最终只有实现在操作系统以上的应用层Oracle公司以及其他虚拟机发行商发布过许多可以运行在各种不同硬件平台和操作系统上的Java虚拟机这些虚拟机都可以载入和执行同一种平台无关的字节码从而实现了程序的“一次编写到处运行”。各种不同平台的Java虚拟机以及所有平台都统一支持的程序存储格式——字节码Byte Code是构成平台无关性的基石。 Java虚拟机的另一大特性是语言无关性。 实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不与包括Java语言在内的任何程序语言绑定它只与“Class文件”这种特定的二进制文件格式所关联Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。 基于安全方面的考虑《Java虚拟机规范》中要求在Class文件必须应用许多强制性的语法和结构化约束但图灵完备的字节码格式保证了任意一门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件。作为一个通用的、与机器无关的执行平台任何其他语言的实现者都可以将Java虚拟机作为他们语言的运行基础以Class文件作为他们产品的交付媒介。例如使用Java编译器可以把Java代码编译为存储字节码的Class文件使用JRuby等其他语言的编译器一样可以把它们的源程序代码编译成Class文件。虚拟机丝毫不关心Class的来源是什么语言它与程序语言之间的关系如下图所示。 Java语言中的各种语法、关键字、常量变量和运算符号的语义最终都会由多条字节码指令组合来表达这决定了字节码指令所能提供的语言描述能力必须比Java语言本身更加强大才行。因此有一些Java语言本身无法有效支持的语言特性并不代表在字节码中也无法有效表达出来这为其他程序语言实现一些有别于Java的语言特性提供了发挥空间。 虚拟机类加载机制 代码编译的结果从本地机器码转变为字节码是存储格式发展的一小步却是编程语言发展的一 大步 概述 在Class文件中描述的各类信息最终都需要加载到虚拟机中之后才能被运行和使用。 Java虚拟机把描述类的数据从Class文件加载到内存并对数据进行校验、转换解析和初始化最终形成可以被虚拟机直接使用的Java类型这个过程被称作虚拟机的类加载机制。与那些在编译时需要进行连接的语言不同在Java语言里面类型的加载、连接和初始化过程都是在程序运行期间完成的这种策略让Java语言进行提前编译会面临额外的困难也会让类加载时稍微增加一些性能开销但是却为Java应用提供了极高的扩展性和灵活性Java天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。 例如编写一个面向接口的应用程序可以等到运行时再指定其实际的实现类用户可以通过Java预置的或自定义类加载器让某个本地的应用程序在运行时从网络或其他地方上加载一个二进制流作为其程序代码的一部分。这种动态组装应用的方式目前已广泛应用于Java程序之中从最基础的Applet、JSP到相对复杂的OSGi技术都依赖着Java语言运行期类加载才得以诞生。 为了避免语言表达中可能产生的偏差先设立两个语言上的约定 第一在实际情况中每个Class文件都有代表着Java语言中的一个类或接口的可能后文中直接对“类型”的描述都同时蕴含着类和接口的可能性而需要对类和接口分开描述的场景会特别指明 第二介绍时所提到的“Class文件”也并非特指某个存在于具体磁盘中的文件而应当是一串二进制字节流无论其以何种形式存在包括但不限于磁盘文件、网络、数据库、内存或者动态产生等。 类加载的时机 一个类型从被加载到虚拟机内存中开始到卸载出内存为止它的整个生命周期将会经历加载Loading、验证Verification、准备Preparation、解析Resolution、初始化Initialization、使用Using和卸载Unloading七个阶段其中验证、准备、解析三个部分统称为连接Linking。这七个阶段的发生顺序如下图所示 上图中加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的类型的加载过程必须按照这种顺序按部就班地开始而解析阶段则不一定它在某些情况下可以在初始化阶段之后再开始这是为了支持Java语言的运行时绑定特性也称为动态绑定或晚期绑定。请注意这里写的是按部就班地“开始”而不是按部就班地“进行”或按部就班地“完成”强调这点是因为这些阶段通常都是互相交叉地混合进行的会在一个阶段执行的过程中调用、激活另一个阶段。 关于在什么情况下需要开始类加载过程的第一个阶段“加载”《Java虚拟机规范》中并没有进行强制约束这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段《Java虚拟机规范》则是严格规定了有且只有六种情况必须立即对类进行“初始化”而加载、验证、准备自然需要在此之前开始 遇到new、getstatic、putstatic或invokestatic这四条字节码指令时如果类型没有进行过初始化则需要先触发其初始化阶段。能够生成这四条指令的典型Java代码场景有 使用new关键字实例化对象的时候。 读取或设置一个类型的静态字段被final修饰、已在编译期把结果放入常量池的静态字段除外 的时候。 调用一个类型的静态方法的时候。使用java.lang.reflect包的方法对类型进行反射调用的时候如果类型没有进行过初始化则需要先触发其初始化。当初始化类的时候如果发现其父类还没有进行过初始化则需要先触发其父类的初始化。当虚拟机启动时用户需要指定一个要执行的主类包含main()方法的那个类虚拟机会先 初始化这个主类。当使用JDK 7新加入的动态语言支持时如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial四种类型的方法句柄并且这个方法句柄对应的类没有进行过初始化则需要先触发其初始化。当一个接口中定义了JDK 8新加入的默认方法被default关键字修饰的接口方法时如果有这个接口的实现类发生了初始化那该接口要在其之前被初始化。 对于这六种会触发类型进行初始化的场景《Java虚拟机规范》中使用了一个非常强烈的限定语——“有且只有”这六种场景中的行为称为对一个类型进行主动引用。除此之外所有引用类型的方式都不会触发初始化称为被动引用。下面举三个例子来说明何为被动引用被动引用代码示例1 package org.fenixsoft.classloading; /*** 被动使用类字段演示一* 通过子类引用父类的静态字段不会导致子类初始化**/ public class SuperClass {static {System.out.println(SuperClass init!);}public static int value 123; }public class SubClass extends SuperClass {static {System.out.println(SubClass init!);} }/*** 非主动使用类字段演示**/ public class NotInitialization {public static void main(String[] args) {System.out.println(SubClass.value);} }上述代码运行之后只会输出“SuperClass init”而不会输出“SubClass init”。对于静态字段只有直接定义这个字段的类才会被初始化因此通过其子类来引用父类中定义的静态字段只会触发父类的初始化而不会触发子类的初始化。至于是否要触发子类的加载和验证阶段在《Java虚拟机规范》中并未明确规定所以这点取决于虚拟机的具体实现。对于HotSpot虚拟机来说可通过-XXTraceClassLoading参数观察到此操作是会导致子类加载的。 被动引用代码示例2 package org.fenixsoft.classloading; /*** 被动使用类字段演示一* 通过子类引用父类的静态字段不会导致子类初始化**/ public class SuperClass {static {System.out.println(SuperClass init!);}public static int value 123; }public class SubClass extends SuperClass {static {System.out.println(SubClass init!);} }package org.fenixsoft.classloading; /*** 被动使用类字段演示二* 通过数组定义来引用类不会触发此类的初始化**/ public class NotInitialization {public static void main(String[] args) {SuperClass[] sca new SuperClass[10];} }这段代码运行之后发现没有输出“SuperClass init”说明并没有触发org.fenixsoft.classloading.SuperClass的初始化阶段。但是这段代码里面触发了另一个名为“[Lorg.fenixsoft.classloading.SuperClass”的类的初始化阶段对于用户代码来说这并不是一个合法的类型名称它是一个由虚拟机自动生成的、直接继承于java.lang.Object的子类创建动作由字节码指令newarray触发。 这个类代表了一个元素类型为org.fenixsoft.classloading.SuperClass的一维数组数组中应有的属性和方法用户可直接使用的只有被修饰为public的length属性和clone()方法都实现在这个类里。Java语言中对数组的访问要比C/C相对安全很大程度上就是因为这个类包装了数组元素的访问而C/C中则是直接翻译为对数组指针的移动。在Java语言里当检查到发生数组越界时会抛出java.lang.ArrayIndexOutOfBoundsException异常避免了直接造成非法内存访问。 ce) 被动引用代码示例3 package org.fenixsoft.classloading; /** 被动使用类字段演示三常量在编译阶段会存入调用类的常量池中本质上没有直接引用到定义常量的类因此不会触发定义常量的 类的初始化 package org.fenixsoft.classloading; /*** 被动使用类字段演示三* 常量在编译阶段会存入调用类的常量池中本质上没有直接引用到定义常量的类因此不会触发定义常量的* 类的初始化**/ public class ConstClass {static {System.out.println(ConstClass init!);}public static final String HELLOWORLD hello world; }/** * 非主动使用类字段演示 **/ public class NotInitialization {public static void main(String[] args) {System.out.println(ConstClass.HELLOWORLD);} }上述代码运行之后也没有输出“ConstClass init”这是因为虽然在Java源码中确实引用了ConstClass类的常量HELLOWORLD但其实在编译阶段通过常量传播优化已经将此常量的值“hello world”直接存储在NotInitialization类的常量池中以后NotInitialization对常量ConstClass.HELLOWORLD的引用实际都被转化为NotInitialization类对自身常量池的引用了。也就是说实际上NotInitialization的Class文件之中并没有ConstClass类的符号引用入口这两个类在编译成Class文件后就已不存在任何联系了。 接口的加载过程与类加载过程稍有不同针对接口需要做一些特殊说明接口也有初始化过程这点与类是一致的上面的代码都是用静态语句块“static{}”来输出初始化信息的而接口中不能使用“static{}”语句块但编译器仍然会为接口生成“()”类构造器用于初始化接口中所定义的 成员变量。接口与类真正有所区别的是前面讲述的六种“有且仅有”需要触发初始化场景中的第三种当一个类在初始化时要求其父类全部都已经初始化过了但是一个接口在初始化时并不要求其父接口全部都完成了初始化只有在真正使用到父接口的时候如引用接口中定义的常量才会初始化。
http://www.hkea.cn/news/14529691/

相关文章:

  • 中山市网站开发外包公司全国前十装饰公司排名
  • 郑州汉狮专业做网站公司dede导入wordpress
  • 龙岗建网站公司齐鲁人才网招聘网
  • 技术网站摄影网页设计方案
  • 上海共富新村网站建设wordpress超联系
  • 肇庆网站优化建设网站建设除凡科外还有哪些
  • 企业网站报价方案模板龙岩建筑网
  • 潍坊品牌网站建设公司在手机上开发app
  • 山东网站制作策划短视频seo优化
  • 宜昌营销网站建设输入网站查看空间
  • 4成都网站建设一起做网店一样的网站
  • 企业做网站有用吗天涯做网站图片尺寸
  • 浏览器直接进入网站新闻发布网站如果做
  • 国外建站用什么最多wordpress的好
  • 做破解网站合法中小微企业名录库
  • 经开区网站建设不用登录的小游戏网站
  • 做网站如何选择数据源保定医疗网站建设公司
  • 网站开发框架有哪些网站开发准备工作
  • 网站类型有平面设计网站培训中心
  • 句容市网站seo优化排名设计网站公司的账务处理
  • 网站运营繁忙网站设计评语
  • 透明网站模板网站开发图片文字
  • 淘宝网站的建设目标亚马逊的免费网站
  • 佛山新网站建设案例哈尔滨模板网站建设
  • 重庆景点门票价格一览表贵州快速整站优化
  • 网站建设自己怎么做软件工程要学什么
  • 响应式网站的开发办公室装修怎么做账
  • 外贸网站建设哪里实惠wordpress 会员名字
  • 网站怎么怎么做关键字仙居建设局网站
  • 网站浮动广告代码一级a做爰片免费网站