簡體   English   中英

在Java中,為“new Object()”在堆棧和堆上分配了多少內存

[英]In Java, How much memory is allocated on stack and heap for “new Object()”

這是我的面試問題之一,但我仍然試圖解決這個問題。 如果我創建“new Object()”,則對該對象的引用將在堆棧上,這將是64位上的8個字節。 然后,問題是什么在堆上。 采訪者后來提到,堆上總會分配兩件事,分別是“Class”對象和“Monitor”。 有人可以解釋一下在創建“new Object()”時會分配多少內存/分配的內容?

如果我創建“new Object()”,則對該對象的引用將在堆棧上,這將是64位上的8個字節。

即使對於64位JVM,最有可能是4字節。 Oracle / OpenJDK支持使用4個字節進行引用的CompressesOops。

然后,問題是什么在堆上。

對象的標題。 它沒有字段。

采訪者后來提到,總會在堆上分配兩個東西,即“類”對象

Class對象是存儲在堆外的信息的代理。 即使存在類的實例,它也不一定存在(盡管對於Object它可能已經存在)

以及“監視器”。

同樣,只有在使用時才會創建監視器,即synchornized

有人可以解釋一下在創建“new Object()”時會分配多少內存/分配的內容?

在64位JVM上,標頭默認為12個字節,但是對象對齊時,它將使用16個字節。 在32位JVM上,它只有8個字節。

在具有CompressedOops的32位JVM和64位JVM上,引用只有4個字節(這是大多數JVM)

您的new Object()沒有引用。 它只是一個將在堆空間上分配的對象。

如果是這樣的話:

Object someReference = new Object();

然后someReference將在線程堆棧空間。 但是對象本身將始終在堆上。

讓我們舉一個例子:

如果您要執行此語句:

Employee emp = new Employee();

你有像以下的記憶:

  • :存儲new Employee()即實際對象
  • 堆棧 :存儲有關emp即引用的信息
  • Perm Space / Metaspace :存儲有關Employee類的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM