JVM 为 32 位还是 64 位?

2022-09-01 19:20:18

在这里阅读这本书时。

我可以看到以下部分,其中说:

32 位还是 64 位?如果您使用的是 32 位操作系统,那么必须使用 32 位版本的 JVM。如果您使用的是 64 位操作系统,则可以选择使用 32 位或 64 位版本的 Java。不要以为仅仅因为您有一个 64 位操作系统,你还必须使用 64 位版本的 Java。

如果堆的大小小于大约 3 GB,则 32 位版本的 Java 将更快,占用空间更小。这是因为 JVM 中的内存引用只有 32 位,并且操作这些内存引用比操作 64 位引用(即使您有 64 位 CPU)便宜。32 位引用也使用较少的内存。

第8章讨论了压缩的oops,这是JVM即使在64位JVM中也可以使用32位地址的一种方式。但是,即使进行了这种优化,64 位 JVM 也将具有更大的占用空间,因为它使用的本机代码仍将具有 64 位地址。

32位JVM的缺点是总进程大小必须小于4GB(在某些版本的Windows上为3GB,在某些旧版本的Linux上为3.5GB)。这包括堆、permgen 以及 JVM 使用的本机代码和本机内存。在32位JVM上广泛使用长变量或双变量的程序会变慢,因为它们不能使用CPU的64位寄存器,尽管这是一个非常特殊的情况。

适合 32 位地址空间的程序在 32 位 JVM 中的运行速度比类似配置的 64 位 JVM 快 5% 到 20%。例如,本章前面讨论的库存批处理程序在桌面上的 32 位 JVM 上运行时速度提高了 20%。

这些行说32位对于较小的堆大小(小于3GB)将更快。如果这是真的,我想知道它背后的原因,是什么让32位JVM更快?


答案 1

我对作者的说法持怀疑态度,即使用32位版本的JVM将使性能提高5%到20%。但是,我很少使用Java,所以我不确定。但是为了调查这一说法,我查看了SPEC的一些结果。

我搜索了SPECjEnterprise2010的结果,x86-64架构的最高分是使用64位版本JVM的Oracle系统

我还查看了 SPECjvm2008,以防这些较小的工作负载可能受益于 32 位体系结构。但同样,性能最好的x86-64系统,这次来自华为,使用的是64位版本的JVM。

如果32位版本的JVM真的更好,我希望提交SPEC结果的人在调整工作负载时会选择它(但我可能是错的)。

我不怀疑有些工作负载的32位版本的JVM将优于64位版本。正如其他人所指出的那样,它使用更多的内存用于地址。但是,x86-64体系结构具有更多可用的寄存器,我怀疑64位操作模式是大多数优化工作的重点。

系统性能有许多组件,我不认为32位版本的JVM一定会超过64位版本(首先,这只适用于CPU密集型工作负载)。我想说的是,如果您在性能调优过程中走到了这一步,您将需要检查自己的工作负载中是否有两个不同的选项,并使用您自己的测试结果来做出决定,而不是假设使用32位比64位更好,因为节省了地址的内存空间作为经验法则, 因为还有其他因素可能比这更重要。


答案 2

这更像是一般性能的问题。如果你有一个最新的64位处理器和大量未使用的内存,那么使用JVM 32而不是JVM 64的唯一可能的增益是,一些循环可以完全适合32位地址的高速缓存,而不是64位的,从而导致32位JVM的主内存访问更少。我真的无法评估收益,但除了非常特殊的情况外,我怀疑它达到5%到20%-请注意,我只怀疑,不确定...

但是,如果您使用的是资源有限的系统,最终因为您想要优化硬件并在其上运行许多虚拟机,因此32位JVM使用的内存将远远少于64位JVM。它将为其他应用程序和系统留出更多可用内存,从而避免交换并允许系统更好地缓存磁盘IO。

恕我直言,没有一般规则。我只使用以下经验法则:如果当JVM和所有其他应用程序运行时,系统仍然有足够的内存来缓存IO,我会使用64位JVM,在相反的情况下使用32位JVM。

当然,只有当Java应用程序本身不需要大量内存来强制使用64位JVM时,上述才有意义 - 并且最终在必要时向系统添加更多内存,因为现在内存并不那么昂贵。


推荐