用于JVM的32位或64位?

在这里阅读这本书。

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

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)。 这包括JVM使用的堆,permgen,本地代码和本机内存。 在32位JVM上广泛使用长变量或双变量的程序将会变慢,因为它们不能使用CPU的64位寄存器,尽管这是非常特殊的情况。

32位地址空间内的程序在32位JVM中的运行速度比类似配置的64位JVM的运行速度快5%至20%。 例如,本章前面讨论的股票批量程序在桌面上的32位JVM上运行速度提高了20%。

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


这更多的是一般表现。 如果你有一个最近的64位处理器和大量未使用的内存,使用JVM 32而不是JVM 64的唯一可能的增益是一些循环可以完全适应32位地址的缓存而不是64位的缓存,从而减少主内存使用32位JVM访问。 我真的不能评估收益,但除非特殊情况下,我怀疑它会达到5%到20% - 注意我只怀疑,不确定...

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

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

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


我对作者声称使用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位更好,因为还有其他因素可能比这更重要。


没有简单的答案,最好的办法就是尝试一下你的具体应用。 但是您应该记住,还有很多其他选项,例如关于JIT,垃圾收集算法,RAM限制等,这些选项可能比架构的选择有更大的影响,因此您必须将这些选项包含在测量中。

如果你问过这个问题,换句话说就是有这个选择,这意味着你已经运行在一个具有32位模式的64位系统上(具有可接受的性能,即没有软件仿真),这很可能是AMD64又名x86-64 。

在这样的系统上,Oracle的JVM支持“压缩oops”,这意味着只要最大堆不超过32 GB就可以在Java堆中使用32位引用(如果存在,我怀疑是否使用32位是该应用程序的有效选择) 。 与32位JVM相比,它可能仍然消耗更多的RAM,因为某些组件仍然需要使用64位指针,但这些通常不是应用程序性能相关的部分。

请注意,对于使用64位模式的AMD64又名x86-64架构,不仅仅意味着更改指针大小。 注意只允许使用每个寄存器64位,它也有更多的可用寄存器。 这是在同一芯片内部实现的不同架构,取决于您的应用,这可能是一个很大的改进。

但如前所述,用真正的应用程序进行测试是获得正确答案的唯一有效方法。

链接地址: http://www.djcxy.com/p/86523.html

上一篇: 32 OR 64 BIT for the JVM?

下一篇: Benchmarking code with a StopWatch or similar