64位Java VM运行速度慢10倍

时间:2009-12-02 17:45:41

标签: java macos jvm 64-bit jarbundler

我有一个使用JarBundler打包的Java应用程序。该应用程序相当CPU密集型(许多大型Collection.sort()调用)。

在Mac OS上,当使用64位JavaApplicationStub时,应用程序运行缓慢且缓慢。此JavaApplicationStub文件正在启动Java 64位VM。

我找到了一个只有32位的旧JavaApplicationStub文件。我在Bundle中替换它,应用程序运行速度提高了10倍! (因此,应用程序运行时会使用32位VM。)

这有什么意义吗?为什么64位虚拟机这么慢?构建应用程序并破解JavaApplicationStub文件是否有意义?

建议表示赞赏。

2 个答案:

答案 0 :(得分:5)

有关运行64位JVM的好处/缺点,请参阅this post。总之,指针解除引用&内存取消分配可能需要更长的时间 - 而且你正在移动更大的数据结构(即64位,而不是32位,这对你没有任何好处,除非你明确地使用它们)。

另请参阅this relevant article,其中讨论了移动到64位时性能下降高达85%的情况,这与您的体验一致:

  

性能下降的原因实际上与内存增加有很大关系。 Java封面下的内存引用增加了两倍,增加了WAS运行时和应用程序对象中内存结构的大小。不幸的是,处理器内存缓存大小并没有同时变大。这意味着更多的内存缓存未命中,这意味着处理更大内存的硬件工作更繁忙,这意味着应用程序性能更差。

答案 1 :(得分:-1)

64位并不慢。 尝试:

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中告诉我们你得到了什么结果