当前位置: 首页 > 面试题库 >

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

莫英喆
2023-03-14
问题内容

该ProGuard的主页上列出的功能:

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

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

重要吗?

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


问题答案:

如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类文件时运行一些基准测试,以比较性能差异。



 类似资料:
  • JVM类加载机制主要有三种: 1、全盘负责 类加载器加载某个class时,该class所依赖的和引用其它的class也由该类加载器载入。 2、双亲委派 先让父加载器加载该class,父加载器无法加载时才考虑自己加载。 3、缓存机制 缓存机制保证所有加载过的class都会被缓存,当程序中需要某个class时,先从缓存区中搜索,如果不存在,才会读取该类对应的二进制数据,并将其转换成class对象,存入

  • 问题内容: 我无法在JLS / JVMSpec或SO中轻松找到它。我确定一定有人问过… 那么,“新”实际上是做什么的呢?假设我们在A中实例化一个B类: 这等于 ? 是不是还是在每种环境下都无法正常工作? 如果您能将我引到JLS / JVMSpec中的相应章节,将不胜感激。谢谢! 编辑:我们肯定不能叫在打电话,因为B的尚未加载。JVM必须根据导入语句来解析名称。 问题答案: 这等于 name”).n

  • 问题内容: 我正在实现一个需要序列化和反序列化大型 对象,所以我用“pickle”、“cPickle”和“marshal”进行了一些测试` 模块选择最好的模块。一路上我发现了一些非常有趣的东西 有趣的是: 我在一个dict列表中使用dumps,然后loads, 元组、整数、浮点和字符串。 这是我的基准测试的输出: 所以,从这些结果中我们可以看出,元帅的速度非常快**作为基准的一部分: 比“pick

  • 我已经使用objectstream和fileoutputstream将HashMap序列化为一个文件。这是一个非常庞大的HashMap,大约有1.5亿条条目。当我从文件中读回它时,加载它需要很长时间(~40分钟)。 我使用FileOutputStream后跟ObjectOutputStream来序列化对象。然后,我使用ObjectInputStream和FileInputStream读取对象。 有

  • 问题内容: 什么是Java的延迟加载?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设您有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着它在加载父级时实际上并不会加载所有子级。而是在要求时加载它们。您可以显式地请求此请求,或者,更常见的是,当您尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通常您不

  • 问题内容: Java中的延迟加载是什么?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设你有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着在加载父级时,它实际上并未加载所有子级。而是在要求时加载它们。你可以显式地请求此请求,也可以是更常见的情况,当你尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通