【问题标题】:64-bit Java VM runs app 10x slower64 位 Java VM 运行应用程序慢 10 倍
【发布时间】:2010-12-22 12:28:24
【问题描述】:

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

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

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

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

不胜感激。

【问题讨论】:

  • 只是检查,但您运行的硬件是什么?
  • 尤其是你有多少内存。如果机器正在交换,请检查活动查看器。
  • 在 MacBook Core 2 Duo 10.5.8 上运行

标签: java macos jvm 64-bit jarbundler


【解决方案1】:

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

另请参阅this relevant article,他们在其中讨论了迁移到 64 位时性能会下降多达 85%,这与您所遇到的情况一致:

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

【讨论】:

  • 因此,如果坚持使用 32 位是答案,那么执行此操作的最佳方法是什么? JavaApplicationStub 应该恢复到 32 位版本,还是应该使用不同的 VM 参数执行?
  • 我不是 JavaApplicationStub/mac 用户,找不到任何与之相关的文档,但在标准 Sun jvm 上,目前还没有“在 32 位模式下运行 64 位 jvm”选项据我所知(java.sun.com/javase/technologies/hotspot/…),如果可以的话,请使用 32 位版本。
【解决方案2】:

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-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多