一尘不染

Java 6类加载中更快的是什么?

java

ProGuard的主页上列出的功能:

  • 重新定位和预先验证Java 6的现有类文件,以充分利用Java 6更快的类加载速度。

它所指的Java 6有什么区别?

重要吗?

它会对通过默认类加载器的同步方面的多线程导致的速度下降产生影响吗?


阅读 158

收藏
2020-12-03

共1个答案

一尘不染

ProGuard
常见问题解答所提示

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

查看“
按类型检查Java虚拟机规范
验证”部分:

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

这意味着Java虚拟机实现无法选择在一种情况下而不是在另一种情况下求助于类型推断。它必须拒绝未通过类型检查进行验证的类文件,或者必须在类型检查失败时始终将故障转移到类型推断验证程序。

对于每个具有Code属性的方法,类型检查器都需要一个堆栈映射框架列表。类型检查器为每种此类方法读取堆栈映射框架,并使用这些映射生成Code属性中指令的类型安全性证明。

从Java
6,类文件50.0及更高版本开始,JVM可以在类文件验证期间使用类型检查或类型推断。在试图了解性能优势之前,什么是类型检查和类型推断?本文面向对象的编程语言的类型检查和类型推断指出:

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

并从维基百科上进行类型推断

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

为了获得推断表达式类型所需的信息,编译器要么以汇总形式收集此信息,然后对为其子表达式指定的类型注释进行缩减,要么通过对各种原子值的类型的隐式理解[…
]。

OpenJDK的HotSport运行时概述解释说好听一点:

当前有两种分析字节码以确定每种指令将出现的操作数的类型和数量的方法。传统方法称为“类型推断”,它通过对每个字节码执行抽象解释并在分支目标或异常句柄处合并类型状态来进行操作。分析遍历字节码,直到找到类型的稳定状态为止。如果找不到稳定状态,或者生成的类型违反某些字节码约束,则将引发VerifyError。[…]

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

类型检查意味着JVM可以一次遍历类文件来验证类型系统。类型推断需要多次通过。这是否可以节省大量的性能?这可能与应用程序中类的总数以及小于50.0(Java
6)且大于50.0的类文件的数量有关。如果您的应用程序不是性能至关重要的应用程序,那么我就不必担心。如果是这样,则可以在将应用程序编译为Java
5和Java 6类文件时运行一些基准测试,以比较性能差异。

2020-12-03