最近我一直在对我公司的数据库产品的写入性能进行一些基准测试,我发现只需切换到 64 位 JVM 就能使性能持续提高 20-30%。
我不能详细介绍我们的产品,但基本上它是一个面向列的数据库,针对存储日志进行了优化。基准测试涉及向它提供几千兆字节的原始日志,并计算分析它们并将它们作为结构化数据存储在数据库中所需的时间。该处理对 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网站here .
JVM 在 64 位模式下运行时允许使用更多的寄存器,这会稍微加快速度。
鉴于以上三点,我预计 64 位的性能会稍微慢一些,或者大约等于 32 位 JVM。
有什么想法吗?提前致谢。
编辑:澄清了有关基准测试环境的一些要点。
最佳答案
发件人:http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_performance
“一般来说,与在 32 位 VM 上运行相同的应用程序相比,在 64 位 VM 中能够寻址大量内存的好处是性能损失很小。这是因为每个 native 指针在系统中占用 8 个字节而不是 4 个字节。加载这些额外数据会影响内存使用,这会导致执行速度稍慢,具体取决于 Java 程序执行期间加载了多少指针。好消息是在 64 位模式下运行的 AMD64 和 EM64T 平台,Java VM 获得了一些额外的寄存器,它可以用来生成更高效的 native 指令序列。这些额外的寄存器将性能提高到在比较 32 时通常完全没有性能损失的程度到 64 位执行速度。
将在 64 位平台上运行的应用程序与在 SPARC 上的 32 位平台上运行的应用程序进行比较,当您迁移到 64 位 VM 时,性能差异约为 10-20%。在 AMD64 和 EM64T 平台上,这种差异在 0-15% 之间,具体取决于访问应用程序执行的指针数量。”
关于java - 为什么 64 位 JVM 比 32 位更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16735720/