Java 为什么64位JVM比32位JVM快?

Java 为什么64位JVM比32位JVM快?,java,64-bit,jvm,performance,Java,64 Bit,Jvm,Performance,最近,我对公司数据库产品的写性能进行了一些基准测试,发现只要切换到64位JVM,性能就会持续提高20-30% 我不允许详细介绍我们的产品,但基本上它是一个面向列的数据库,用于存储日志。基准测试包括向其提供几GB的原始日志,并计时分析日志和将其作为结构化数据存储在数据库中所需的时间。CPU和I/O的处理都非常繁重,尽管很难说是什么比例 有关设置的一些注意事项: Processor: Xeon E5640 2.66GHz (4 core) x 2 RAM: 24GB Disk: 7200rpm, n

最近,我对公司数据库产品的写性能进行了一些基准测试,发现只要切换到64位JVM,性能就会持续提高20-30%

我不允许详细介绍我们的产品,但基本上它是一个面向列的数据库,用于存储日志。基准测试包括向其提供几GB的原始日志,并计时分析日志和将其作为结构化数据存储在数据库中所需的时间。CPU和I/O的处理都非常繁重,尽管很难说是什么比例

有关设置的一些注意事项:

Processor: Xeon E5640 2.66GHz (4 core) x 2
RAM: 24GB
Disk: 7200rpm, no RAID
OS: RHEL 6 64bit
Filesystem: Ext4
JVMs: 1.6.0_21 (32bit), 1.6.0_23 (64bit)
Max heap size (-Xmx): 512 MB (for both 32bit and 64bit JVMs)
两个JVM的常量:

  • 相同操作系统(64位RHEL)
  • 相同硬件(64位CPU)
  • 最大堆大小固定为512 MB(因此速度的提高不是因为64位JVM使用了更大的堆)
为了简单起见,我已经关闭了产品中的所有多线程选项,所以几乎所有的处理都是以单线程方式进行的。(当我打开多线程时,系统当然会变得更快,但32位和64位性能之间的比率保持不变。)

所以,我的问题是。。。为什么在使用64位JVM时会看到20-30%的速度提升?以前有人见过类似的结果吗

到目前为止,我的直觉如下:

  • 64位指针更大,因此L1和L2缓存更容易溢出,因此64位JVM上的性能更差

  • JVM使用一些奇特的指针压缩技巧来尽可能地缓解上述问题。有关Sun站点的详细信息

  • JVM允许在64位模式下运行时使用更多寄存器,这会稍微加快速度

考虑到以上三点,我预计64位的性能会稍微慢一点,或者大约等于32位JVM

有什么想法吗?提前谢谢


编辑:阐明了有关基准测试环境的一些要点。

认识到64位JVM不是制作Java应用程序的神奇精灵 快点。64位JVM允许堆>>4 GB,因此,只有这样才有意义 适用于可以利用系统上的巨大内存的应用程序 拿去吧

通常情况下,会有轻微的改进(由于某些硬件原因 某些平台上的优化)或轻微降级(由于 指针大小)。一般来说,需要更少的GC,但是 当它们发生时,它们可能会更长

内存中的数据库或搜索引擎可以使用增加的内存 对于缓存对象,从而避免IPC或磁盘访问,将看到最大的 应用程序级别的改进。此外,还将提供64位JVM 允许您运行比32位线程多得多的线程,因为 有更多的地址空间用于线程堆栈等 32位JVM的最大线程数通常为~1000个,而64位JVM的最大线程数为~100000个

但也有一些缺点:
64位JVM的其他问题是某些客户端 面向对象的特性,如Java插件和Java Web Start 不支持。此外,任何本机代码也需要 要兼容(例如,JNI用于II型JDBC驱动程序)。 这对于纯Java开发人员来说是一个额外的奖励,就像纯应用程序应该做的那样 从盒子里拿出来


更多关于此线程的信息,请点击我的最佳猜测,基于快速谷歌搜索32位与64位性能图表, 64位I/O的效率更高。我想你做了很多I/O


如果移动数据时涉及memcpy,那么复制long可能比复制int更有效。

64位指令集多了8个寄存器,这将使代码整体速度更快

但是,由于处理器现在主要等待内存或磁盘,我认为内存子系统或磁盘i/o在64位模式下可能更高效。

来自:

“一般来说,与在32位虚拟机上运行相同的应用程序相比,64位虚拟机能够处理大量内存带来的好处是性能损失较小。这是因为系统中的每个本机指针占用8字节而不是4字节。加载这些额外数据会对内存使用产生影响,这会导致执行速度稍慢,具体取决于Java程序执行期间加载的指针数量。好消息是,在64位模式下运行的AMD64和EM64T平台上,Java虚拟机可以获得一些额外的寄存器,用于生成更高效的本机指令序列。这些额外的寄存器提高了性能,在比较32位到64位的执行速度时,通常不会出现任何性能损失。

将运行在64位平台上的应用程序与SPARC上的32位平台上的应用程序进行比较,当您移动到64位VM时,性能差异大约为10-20%。在AMD64和EM64T平台上,这种差异在0-15%之间,具体取决于访问应用程序的指针数量。”

在不了解您的硬件的情况下,我只是做了一些尝试

  • 您的特定CPU可能正在使用微码来“模拟”某些x86指令,尤其是x87 ISA指令
  • StuttFP,数学差异可能是真正的杀手。
  • 内存。64位为您提供了更多的地址空间。可能GC在64位模式下的攻击性较小,因为您有额外的RAM
  • 您的操作系统是否处于64b模式,并通过某种包装实用程序运行32b jvm

您是否在64位操作系统上运行32位JVM?如果是,您必须记住,64位操作系统上的32位应用程序将被“模拟”,因此会失去一些性能。请检查32位操作系统->32位JVM和64位操作系统->64位JVM上的性能。此外,这是否与内存有关?也就是说,在64位版本上