2010-09-17 33 views
16

對32位JVM上的對象(至少在熱點上)的引用佔用4個字節。64位JVM上對象引用的內存要求

64位熱點JVM是否需要8個字節?或者是一些聰明的壓縮呢? 如果沒有,每個Object[]將需要兩倍的堆內存,我不知何故認爲(希望,預期)並非如此。

更新/額外的問題:這是否真的重要,或者這是一個微不足道的增加,因爲多數引用指向的是那些比幾個字節大得多(而人們可能會認爲這些對象又大多是由物體對其他對象的引用)?

+1

你可能會覺得這有幫助 - http://stackoverflow.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://stackoverflow.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

回答

15

在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

6

根據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