64 位 Java VM 运行应用程序速度慢 10 倍

发布于 2024-08-12 18:28:30 字数 388 浏览 8 评论 0原文

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

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

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

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

建议表示赞赏。

I have a Java app which is packaged up using JarBundler. The app is fairly CPU intensive (lots of big Collection.sort() calls).

On Mac OS, the app runs slow and sluggish when using the 64-bit JavaApplicationStub. This JavaApplicationStub file is launching the Java 64-bit VM.

I found an old JavaApplicationStub file which is 32-bit only. I replaced it in the Bundle, and the app runs 10x faster! (consequently, the 32-bit VM is utilized when the application runs).

Does this make any sense? Why is the 64-bit VM so much slower? Does it make sense to build an app and hack the JavaApplicationStub file like this?

Advise is appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷夜 2024-08-19 18:28:30

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

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

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

See this post on the benefits/disadvantages of running a 64bit JVM. In summary pointer dereferencing & memory de-allocation can take longer - and you are moving around larger data-structures (i.e. 64, not 32 bit, which serves you no advantage to you unless you are explicity making use of them).

Also see this relevant article, where they discuss decreases in performance of up to 85% when moving to 64bit, which is in-line with what you are experiencing:

The reason for this decrease in performance is actually very much related to the increase in memory. The memory references under the covers of Java became twice the size increasing the size of memory structures in the WAS runtime and your application's objects. Unfortunately the processor memory cache sizes didn't get larger at the same time. This means more memory cache misses, which means more busy work for the hardware dealing with the larger memory, which means worse application performance.

怪我入戏太深 2024-08-19 18:28:30

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 中的}

并告诉我们您得到什么结果

64 bit ain't slower.
Try:

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);

}

in 32 and 64 and tell us what results you get

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文