我有一个使用JarBundler打包的Java应用程序。该应用程序相当CPU密集型(许多大型Collection.sort()调用)。
在Mac OS上,当使用64位JavaApplicationStub时,应用程序运行缓慢且缓慢。此JavaApplicationStub文件正在启动Java 64位VM。
我找到了一个只有32位的旧JavaApplicationStub文件。我在Bundle中替换它,应用程序运行速度提高了10倍! (因此,应用程序运行时会使用32位VM。)
这有什么意义吗?为什么64位虚拟机这么慢?构建应用程序并破解JavaApplicationStub文件是否有意义?
建议表示赞赏。
答案 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中告诉我们你得到了什么结果