2017-06-05 74 views
0

請幫助解答以下問題。 假設我有隻包含方法的類。將堆中的空間分配給由此類創建的對象嗎?如果是,那麼它包含什麼?是否爲沒有實例變量的對象分配內存?

+0

請看到這裏的答案 - https://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object -in-java的 – Fairoz

回答

1

Fairoz的question linked包含最相關的數據,但我會盡量縮小您的案例的信息。

是的。 JVM將從堆中取出一個連續的空間來存儲這些對象。

內容特定於JVM實現。在HotSpot中,您可以看到source code中的具體內容。

  • 將會有一個名爲「Mark」的機器字,它定義爲here,用於保持hashCode,鎖定狀態和垃圾收集。這需要8個字節。
  • 接下來將是一個指向Klass的指針,其中包含有關該類的信息,例如方法。

如果您使用的是64位JVM,並且啓用了compressedOops(如java 8上的默認值),Klass指針將只佔用4個字節。由於您沒有字段,因此總大小爲12個字節。但是,JVM強制對齊到一個完整的單詞,因此您的對象將使用4個字節進行填充。總共有16個字節。

一些有用的文檔: - https://www.infoq.com/articles/Introduction-to-HotSpot - https://psy-lob-saw.blogspot.com.es/2013/05/know-thy-java-object-memory-layout.html