64位Java虚拟机运行应用程序速度慢10倍
我有一个使用JarBundler打包的Java应用程序。该应用程序相当CPU密集(很多大的Collection.sort()调用)。64位Java虚拟机运行应用程序速度慢10倍
在Mac OS上,使用64位JavaApplicationStub时,该应用程序运行缓慢且缓慢。此JavaApplicationStub文件正在启动Java 64位VM。
我发现一个只有32位的旧JavaApplicationStub文件。我在Bundle中替换了它,并且该应用程序运行速度提高了10倍! (因此,应用程序运行时将使用32位虚拟机)。
这是否有意义?为什么64位虚拟机如此慢?构建应用程序并像这样破解JavaApplicationStub文件是否有意义?
建议表示赞赏。
请参阅this post关于运行64位JVM的好处/缺点。在总结指针解引用&内存解除分配可能需要更长的时间 - 而且你正在移动较大的数据结构(即64位,而不是32位,除非你明确使用它们,否则这对你没有任何好处)。
另见this relevant article,在那里他们转移到64位,这是在线与您遇到什么时,在高达85%的性能讨论跌幅:
这样做的原因降低性能实际上是与内存的增加非常相关。 Java封面下的内存引用的大小是WAS运行时和应用程序对象中内存结构大小的两倍。不幸的是,处理器内存缓存的大小并没有同时变大。这意味着更多的内存缓存未命中,这意味着更大的硬件处理更大的内存工作,这意味着更糟糕的应用程序性能。
因此,如果坚持32位是答案,那么执行此操作的最佳方法是什么?应该将JavaApplicationStub恢复到32位版本,还是应该使用不同的虚拟机参数执行? – craiglurey 2009-12-02 19:40:46
我不是一个JavaApplicationStub/mac用户,找不到与之相关的任何文档,但是在标准的Sun jvm中,根据我所知,没有“在32位模式下运行64位jvm”选项(http: //java.sun.com/javase/technologies/hotspot/vmoptions.jsp#BehavioralOptions),所以只要使用32位版本即可。 – Joel 2009-12-03 09:13:59
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,并告诉我们得到了什么结果
只是检查,但什么是你正在运行的硬件? – 2009-12-02 17:50:00
特别是你有多少内存。如果机器正在交换,请检查活动查看器。 – 2009-12-02 18:10:20
在MacBook Core 2 Duo上运行它10.5.8 – craiglurey 2009-12-02 19:17:02