当前位置: 首页 > 面试题库 >

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

华易安
2023-03-14
问题内容

最近,我一直在对我公司的数据库产品的写入性能进行一些基准测试,并且发现仅切换到64位JVM可以使性能持续提高20-30%。

我不允许详细介绍我们的产品,但基本上它是面向列的数据库,已针对存储日志进行了优化。基准测试包括向其提供几GB的原始日志,并确定分析它们并将其作为结构化数据存储在DB中所需的时间。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网站的详细信息,请点击此处。

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

鉴于以上三点,我希望64位性能会稍慢一些,或大约等于32位JVM。

有任何想法吗?提前致谢。

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


问题答案:

不知道你的硬件,我只是在狂奔

  • 您的特定CPU可能正在使用微代码“模拟”某些x86指令-最著名的是x87 ISA
  • x64使用sse数学而不是x87数学,在这种情况下,我注意到某些数学运算繁重的C ++应用程序的速度提高了%10-%20。如果您使用,数学差异可能是真正的杀手kill strictfp
  • 记忆。64位为您提供了更多的地址空间。也许在64位模式下,GC的攻击性较弱,因为您有额外的RAM。
  • 您的操作系统是否处于64b模式并通过某些包装器实用程序运行32b jvm?


 类似资料:
  • 问题内容: 我已经读到 32位Windows上的最大堆大小是〜1.5GB,这是由于JVM需要连续的内存。有人可以解释“连续内存”的概念吗,为什么Windows上最多只有1.5GB? 其次,那么64位Windows上的最大堆大小是什么?为什么与32位Windows上可用的最大堆大小不同? 问题答案: 32位/ 64位部分与Java无关 事实证明,32位系统中的内存位置由32位无符号整数引用。这最多允

  • 问题内容: 问题不在于32位操作系统的最大堆大小,因为32位操作系统的最大可寻址内存大小为4GB,而JVM的最大堆大小取决于可以保留多少连续可用内存。 我对了解在64位OS中运行的32位JVM的最大(理论上和实际可实现的)堆大小更感兴趣。基本上,我正在寻找类似于SO相关问题中的数字的答案。 至于为什么使用32位JVM而不是64位JVM,原因不是技术上的而是管理/官僚的-在生产环境中安装64位JVM

  • 问题内容: 如何确定运行我的应用程序的JVM是32位还是64位?具体来说,我可以在程序中使用哪些函数或属性来检测到这一点? 问题答案: 你使用以下方法检索标记此JVM的位数的系统属性: 可能的结果是: “” – 32位JVM “” – 64位JVM “” –未知的JVM 如HotSpot常见问题解答所述: 编写Java代码时,如何区分32位和64位操作? 没有公共的API可以区分32位和64位操作

  • 问题内容: 我已经使用Java一段时间了,而我典型的设置新开发机的习惯要求从Oracle站点下载并安装最新的JDK。 今天这引发了一个不寻常的问题, 回想起来,我已经安装了之前的两个版本,并且很高兴将普通的工具链插入(Eclipse)。在我的日常编程中,我不会回想起曾经因为使用64位JRE(或为此目的而针对64位JRE)而不得不以其他方式进行更改或思考的事情。 根据我对64位和32位的理解- 确实

  • 问题内容: 我正在使用Launch4J启动我的Java应用程序,如果系统上存在x64 JRE,Launch4J似乎更喜欢它。 不幸的是我的应用程序无法在64位JVM上运行,因为我正在加载32位DLL,这是不可能的,并导致UnsatisfiedLinkError。 有什么方法可以强制/欺骗Launch4J仅使用32位JVM? 问题答案: 大约一年前,我遇到了这个确切的问题,使用Lauch4J封装了一

  • 问题内容: 我的电脑正在使用Windows 7 64位。但是将要部署我的jsp Web应用程序的服务器是32位。 我需要在PC上安装32位JDK / JRE才能进行开发吗?我正在使用Eclipse。 非常感谢你。 问题答案: 您绝对不需要安装32位JRE即可进行开发。您构建的Java代码不会跟踪您的64位。(我假设您没有使用JNI,这会使事情变得有些复杂。) 不过,您 可能 需要安装32位JRE进