首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 6类加载中,什么更快?

在Java 6类加载中,什么更快?
EN

Stack Overflow用户
提问于 2012-05-23 17:27:22
回答 3查看 1.5K关注 0票数 8

ProGuard主页列出了以下功能:

  • 为Java 6重定向和预验证现有的类文件,充分利用Java 6更快的类加载。

它所指的Java 6有什么不同?

有意义吗?

它对通过默认类加载器的同步方面多线程导致的减速有影响吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-24 13:22:45

作为ProGuard 常见问题提示

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

查看Java虚拟机规范 类型校验部分:

如果Java虚拟机实现曾经尝试通过类型推断对版本50.0类文件执行验证,那么在所有类型验证失败的情况下,它都必须这样做。 这意味着Java虚拟机实现不能选择在一次而不是在另一种情况下使用类型推断。它必须拒绝不通过打字机验证的类文件,或者在打字机失败时始终将故障转移到类型推断验证器。 类型检查器需要一个具有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类文件时运行一些比较性能差异的基准。

票数 2
EN

Stack Overflow用户

发布于 2012-05-23 17:37:59

根据这张Java 6白皮书的说法,改进之处是:

Java虚拟机的引导和扩展类加载器得到了增强,以改善Java应用程序的冷启动时间。在Java 6之前,打开系统jar文件导致Java虚拟机读取一个1MB的ZIP索引文件,当该文件不在磁盘缓存中时,该索引文件被转换为大量磁盘查找活动。在启用了“类数据共享”之后,Java虚拟机现在被提供了一个“meta”文件(位于jre/lib中),该文件包含关于哪个包(或包前缀)包含在哪个jar文件中的高级信息。 这有助于JVM在加载Java应用程序类时避免打开引导和扩展类路径上的所有jar文件。

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

票数 2
EN

Stack Overflow用户

发布于 2012-05-23 19:46:47

(回答我自己的问题)

我在什么是预验证?站点的“ProGuard”部分找到了大部分答案:

当加载类文件时,类加载器对字节代码执行一些复杂的验证。此分析确保代码不会意外或有意地从虚拟机的沙箱中跳出。...Java 6引入了分裂验证。...The Java 6编译器将预验证信息添加到类文件(.( StackMapTable属性),以简化类加载器的实际验证步骤。然后,类文件可以更快地以更有效的内存方式加载。

这似乎与并发无关。

因此,剩下的一个问题是:“它有意义吗?”,主要是在以下几个方面被回答为“否”:

运行在1.6VM上的"-target 1.5“生成的Java类文件对性能的影响?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10724942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档