什么';Java 6类加载速度更快吗?

什么';Java 6类加载速度更快吗?,java,performance,jvm,classloader,Java,Performance,Jvm,Classloader,主页作为一项功能列出: 重定目标并预先验证Java 6的现有类文件 充分利用Java6更快的类加载 这指的是Java 6中的什么区别 这有意义吗 通过默认类加载器的同步方面,它是否会对多线程导致的减速产生影响?根据is,这一改进: Java虚拟机的引导类和扩展类装入器已经完成 增强以提高Java应用程序的冷启动时间。之前 JavaSE6,打开系统jar文件导致Java虚拟机 读取一个1兆字节的ZIP索引文件,该文件转换为大量 文件不在磁盘缓存中时的磁盘查找活动。具有 启用了“类数据共享”,现

主页作为一项功能列出:

  • 重定目标并预先验证Java 6的现有类文件 充分利用Java6更快的类加载
这指的是Java 6中的什么区别

这有意义吗


通过默认类加载器的同步方面,它是否会对多线程导致的减速产生影响?

根据is,这一改进:

Java虚拟机的引导类和扩展类装入器已经完成 增强以提高Java应用程序的冷启动时间。之前 JavaSE6,打开系统jar文件导致Java虚拟机 读取一个1兆字节的ZIP索引文件,该文件转换为大量 文件不在磁盘缓存中时的磁盘查找活动。具有 启用了“类数据共享”,现在提供了Java虚拟机 使用包含高级索引的“元索引”文件(位于jre/lib中) 包含哪些包(或包前缀)的信息 其中包含jar文件

这有助于JVM避免在启动和启动时打开所有jar文件 加载Java应用程序类时的扩展类路径

这种特殊的改进不会对运行的程序产生任何影响,因为系统jar中的类已经被加载了。它只会影响应用程序的第一次启动时间。

(回答我自己的问题)

我在ProGuard网站的“”部分找到了大部分答案:

加载类文件时,类加载器执行一些复杂的操作 字节码的验证。此分析确保代码不能 意外或有意地从虚拟世界的沙箱中冲出 机器。[…]Java6引入了拆分验证。 […]Java 6编译器添加了 将验证信息预验证到类文件([…]属性
StackMapTable
中),以简化 类装入器的实际验证步骤。然后,可以创建类文件 加载速度更快,内存效率更高

这似乎与并发无关

因此,剩下的一个问题是:“它有意义吗?”,这一问题的答案主要是“不”:

作为:

Java 6编译器将预验证信息添加到类文件中

看看这一节:

如果Java虚拟机实现曾经尝试在版本50.0类文件上执行类型推断验证,那么在类型检查验证失败的所有情况下,它都必须这样做

这意味着Java虚拟机实现不能选择在一种情况下使用类型推断,而不能在另一种情况下使用类型推断。它必须拒绝未通过类型检查进行验证的类文件,或者在类型检查失败时始终故障切换到类型推断验证器

类型检查器要求每个方法都有一个堆栈映射框列表,该列表带有代码属性。类型检查器读取每个此类方法的堆栈映射帧,并使用这些映射生成代码属性中指令的类型安全性证明

从Java6、类文件50.0和更高版本开始,JVM可以在类文件验证期间使用类型检查或类型推断。在试图理解性能优势之前,什么是类型检查和类型推断?该文件指出:

类型系统是编程语言的重要组成部分。完全依赖于运行时类型检查的语言提供了高度的灵活性,但通常必须牺牲性能

从维基百科上:

类型推断是在编译时自动推断(部分或全部)表达式类型的能力。[……]

为了获得推断表达式类型所需的信息,编译器要么收集这些信息作为为其子表达式提供的类型注释的聚合和后续缩减,要么通过隐式理解各种原子值的类型[…]

报告很好地解释了这一点:

目前有两种分析字节码的方法来确定每条指令的操作数类型和数量。传统的方法称为“类型推断”,其操作方法是对每个字节码执行抽象解释,并在分支目标或异常句柄处合并类型状态。分析将迭代字节码,直到找到类型的稳定状态。如果找不到稳定状态,或者结果类型违反了某些字节码约束,则会抛出VerifyError。[……]

JDK6中新增了第二种验证方法,称为“类型验证”。在这种方法中,Java编译器通过代码属性StackMapTable为每个分支或异常目标提供稳态类型信息。StackMapTable由许多堆栈映射帧组成,每个堆栈映射帧指示表达式堆栈上的项的类型以及方法中某个偏移量处的局部变量中的项的类型。JVM只需执行一次字节码传递,就可以验证字节码类型的正确性。[……]


类型检查意味着JVM可以通过类文件进行一次传递来验证类型系统;类型推断需要多次传递。这是一个显著的性能节约吗?这可能与应用程序中的类总数以及小于50.0(Java6)和大于等于50.0的类文件的数量有关。如果您的应用程序不是性能关键型应用程序,我就不会担心它;如果是,那么您可以运行一些基准测试,比较将应用程序编译为Java 5和Java 6类文件时的性能差异。

它可能指的是:ProGuard修改应用程序类,这将从JVM启动时间p中毫无收获