我是 java 平台的绝对 n00b 我想知道我是否需要更改我的代码中的任何内容以获得 64 位 JRE 的好处?
还是当我用“java -d64”启动它时它会以某种涡轮模式运行?
非常感谢您的帮助
我以前的版本,虽然不是假的,但很快就被过度简化了。
从 32 位更改为 64 位不会自动使您的应用程序运行得更快,在某些情况下可能会导致相反的结果。在“消极”方面,在 JVM 中取消引用内存指针可能需要比 32 位指针更长的时间,64 位指针。与 2 GB 堆相比,16 GB 堆的完整垃圾收集和压缩可能需要更长的时间。
积极的一面:64 位处理器指令比 32 位处理器指令更有效。64 位 JVM 将使您的堆大小比 32 位的 4 GB 大 2 ^ 32 倍,略小于 4 GB。(如果你买得起这么大的 RAM)如果你的堆大小小于 4 GB,一些 JVM 可以使用压缩引用,从而为你提供 64 位指令的优势,而无需支付 64 位取消引用的价格。
如果你有一个好的 JVM,无论堆大小如何,我都会使用 64 位,只是准备好你可能不得不为拥有一个非常大的堆而遭受性能损失。
我认为 64 位 JVM 不会获得应用程序的性能吗?如何?
事实上 64 位处理器有点慢。它们具有更复杂的解码管道(向后支持 32 位操作)。他们需要更多的内存吞吐量(所有指针都是双倍大小的,对吧?)。您在 64 位处理器上唯一拥有的是大量 RAM。正如我们所知,大小就是速度。大量的 RAM 可以很好地提高某些应用程序的性能(如果应用程序可以使用它)。所以 64 位 - 不。大量的内存——绝对是的。
还有一件事是 64 位处理器可以做得更快。64 位数字的原子写入/读取。如果您使用 64 位数字(在 java 中为 long),则 64 位处理器会更好,因为它们具有处理此类数字的机器 CAS 指令。
不,你不需要改变任何东西。使用 64 位没有固有的好处。事实上,它会使您的程序在内存中更大,因为所有指针都将变为 64 位宽而不是 32 位宽。
唯一的优势是当您进行 64 位计算时,例如在您的代码中使用大量“长整数”或者您的应用程序需要超过 4gb 的内存。
因为执行代码的 JVM 的行为应该相同(整数始终是 32 位签名等),所以无论您运行什么平台,都可以保证(理论上)您的代码运行相同。
32/64 位的区别在于 JVM 如何优化运行时。因此,虽然执行的字节码保持不变,但它可能(或可能不会)以不同的方式进行优化。
简而言之,运行 Java 的 64 位系统执行代码的速度可能比等效的 32 位系统更快。
你不应该改变什么。与 C 或 C++ 不同,Java 为其编写了一个规范,以确保无论您在什么平台上,int(和其他数据类型)的长度始终相同。
您的应用程序代码中有任何 JNI 吗?那么也许您需要担心 32 位与 64 位本机二进制文件。
32 或 64 对您的 Java 代码都是一样的。以前的海报似乎已经很好地涵盖了性能方面。
是的,你不需要改变任何东西。不同的是 JRE,而不是您编写的代码。
尝试这个:
public class Benchmark {
public static void main(String args[]) {
long time = System.currentTimeMillis();
for (int a = 1; a < 900000000; a++) {
for (int b = 1; b < 20; b++) {
}
}
long time2 = System.currentTimeMillis() - time;
System.out.println("\nTime counter stopped: " + time2);
}
在 32 位和 64 位中,一笑置之。
我发现 64 位 JVM 比 32 位版本慢。然而,在最新版本的 Java 6 update 14 中,我发现我的许多测试在 64 位版本上比 32 位版本稍微快一些。无论哪种方式,只有 5% 到 10% 的差异。
您的程序是使用 32 位还是 64 位版本取决于您使用的 JVM 的选择。如前所述,您需要检查是否有适当的共享库。(或理想情况下没有)
主要区别在于如果您需要 4 GB 或更多,则可以使用更多内存。