64位JVM上对象引用的内存要求

问题描述:

对32位JVM上的对象(至少在热点上)的引用占用4个字节。64位JVM上对象引用的内存要求

64位热点JVM是否需要8个字节?或者是一些聪明的压缩呢? 如果没有,每个Object[]将需要两倍的堆内存,我不知何故认为(希望,预期)并非如此。

更新/额外的问题:这是否真的重要,或者这是一个微不足道的增加,因为多数引用指向的是那些比几个字节大得多(而人们可能会认为这些对象又大多是由物体对其他对象的引用)?

+1

你可能会觉得这有帮助 - http://*.com/questions/1443677/what-impact-if-any-does-the-d64-swtich-have-on-sun-jvm-resident-memory-usage – 2010-09-17 07:18:58

+0

而这一个:http://*.com/questions/783662/java-32-bit-vs-64-bit-compatibility – Thilo 2010-09-17 07:34:27

+1

只是为了给出一个数据点,当我们将webapp从32位切换到64位时,位JVM,堆使用率增加了约30%。你的里程可能会有所不同,但至少会给你一个球场。 – Cowan 2010-09-17 21:32:43

在64位系统中,对象引用通常是8字节长。但是在Sun/Oracle最近的JVM中,您可以启用Compressed Oops,这样可以将参考大小减少到4个字节,但需要牺牲堆大小的限制。

+0

我认为它对于java 7或> java6 u23是默认启用的,对吧? – 2013-08-04 09:35:30

+0

“在Java SE 6u23和更高版本中默认支持并启用压缩的oops。”请参阅:[Java SE 6 Update 23发行说明](http://www.oracle.com/technetwork/java/javase/6u23releasenotes-191058.html) – snorbi 2013-09-06 18:00:16

+0

但是:“在Java SE 7中,使用压缩的oops是默认值对于未指定-Xmx和-Xmx值小于32千兆字节的64位JVM进程,对于6u23发行版之前的JDK 6,请在java命令中使用-XX:+ UseCompressedOops标志来启用该功能。请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#compressedOop – 2014-03-19 17:40:42

根据Java Platform Performance它是不严格限定的,但在64位的系统上典型地为8个字节:

基准的尺寸没有明确定义,但它通常是4个字节是一个上32位系统和64位系统上的8个字节。

+0

那么Hotspot如何处理呢?如果每个引用都是8个字节,那意味着需要更高的堆。 – Thilo 2010-09-17 06:57:10

+0

打我。没有想到它。虽然这不是微不足道的吗?通常情况下,每个对象存储*东西*,大部分时间超过这8个字节。当然,对于小物体,我可以看出它可能是一个问题,但在这种情况下,对于一个原始物体来说也许会更好。 – aioobe 2010-09-17 07:00:15

+0

该书有一节(在同一页上)*测量对象大小*描述如何测量对象的大小。也许你可以试试并报告。 – aioobe 2010-09-17 07:04:59