8

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

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

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

这有道理吗?为什么 64 位 VM 这么慢?像这样构建应用程序并破解 JavaApplicationStub 文件是否有意义?

建议表示赞赏。

4

2 回答 2

5

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

另请参阅这篇相关文章,他们在其中讨论了迁移到 64 位时性能下降高达 85%,这与您所遇到的情况一致:

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

于 2009-12-02T17:52:54.357 回答
-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 中并告诉我们你得到了什么结果

于 2014-01-27T22:05:09.373 回答