javac 是否根据底层操作系统执行任何字节码级别的优化?
我的理解是,调用 javac 生成的 Java 字节码独立于底层操作系统,但 HotSpot 编译器会在程序运行时执行特定于平台的 JIT 优化和编译。
但是,我在 Windows 上使用 32 位 JDK 编译代码,并在 Solaris 上使用 32 位 JVM 执行代码(这两个操作系统都不是 64 位操作系统)。据我所知(正在确认其规格),Solaris x86 机器在所有方面(内核数量、RAM 数量、硬盘延迟、处理器速度等)都应该优于 Windows 机器。然而,相同的代码在 Windows 上的运行速度明显更快(单个数据点在 Windows 上的操作需要 7.5 秒,而在 Solaris 上则需要 10 秒以上)。我的下一个测试是在 Solaris 上进行编译并记录性能差异,但这对我来说没有意义,而且我找不到任何 Oracle 文档来解释我所看到的内容。
如果两个不同操作系统上的 JVM 版本相同(主要、次要、发行版等),则在相同源文件上调用 javac
会导致 Java 字节码(>.class
文件生成)?有没有任何文档可以解释这种行为?
My understanding is that the Java bytecode produced by invoking javac
is independent of the underlying operating system, but the HotSpot compiler will perform platform-specific JIT optimizations and compilations as the program is running.
However, I compiled code on Windows under a 32 bit JDK and executed it on Solaris under a 32 bit JVM (neither OS is a 64 bit operating system). The Solaris x86 box, to the best of my knowledge (working to confirm the specs on it) should outperform the Windows box in all regards (number of cores, amount of RAM, hard disk latency, processor speed, and so on). However, the same code is running measurably faster on Windows (a single data point would be a 7.5 second operation on Windows taking over 10 seconds on Solaris) on a consistent basis. My next test would be to compile on Solaris and note performance differences, but that just doesn't make sense to me, and I couldn't find any Oracle documentation that would explain what I'm seeing.
Given the same version (major, minor, release, etc.) of the JVM on two different operating systems, would invoking javac
on the same source files result in different optimizations within the Java bytecode (the .class
files produced)? Is there any documentation that explains this behavior?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(6)
无论如何,我决定用谷歌搜索一下。 ;)
http://java.sun.com/docs/white/platform /javaplatform.doc1.html
Java 平台是一个新的软件平台,用于在联网计算机系统上交付和运行高度交互、动态且安全的小程序和应用程序。但 Java 平台的与众不同之处在于,它位于其他平台之上,并执行字节码,字节码不特定于任何物理机,而是虚拟机的机器指令。用 Java 语言编写的程序编译为字节码文件,该文件可以在任何存在 Java 平台的地方、任何底层操作系统上运行。换句话说,同一个文件可以在运行 Java 平台的任何操作系统上运行。这种可移植性之所以成为可能,是因为 Java 平台的核心是 Java 虚拟机。
写于 1996 年 4 月 30 日。
一个常见的错误是假设编译器会优化代码,尤其是在您进行 C/C++ 开发时。它执行一项且仅有一项优化,即评估编译器时间已知常量。
确实,编译器远没有您想象的那么强大,因为它只是验证代码并生成与您的代码尽可能匹配的字节码。
这是因为字节码适用于理想化的虚拟机,理论上不需要任何优化。希望当您以这种方式思考时,编译器确实做了很多事情,但它不知道代码将如何实际使用,这是有道理的。
相反,所有优化都是由 JVM 中的 JIT 执行的。这完全依赖于平台,可以生成 32 位或 64 位代码,并使用运行该代码的处理器的确切指令。它还会根据代码的实际使用方式来优化代码,这是静态编译器无法做到的。这意味着代码可以根据不同的使用模式多次重新编译。 ;)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
编译输出不应依赖于调用 javac 的操作系统。
如果您想验证它,请尝试:
The compilation output should not depend on OS on which javac was called.
If you want to verify it try: