簡體   English   中英

其中基元數組存儲在JVM內存中

[英]Where array of primitives stored in JVM memory

JVM內存分為:1。方法區2.堆區3.堆棧4. PC寄存器5.本機堆棧

  1. 現在假設我有一個具有“int [] dealCodes”屬性的類(int primitive的數組)。 根據內存管理,一旦交易代碼被初始化,內存中將存在(total_elements * 4字節)的連續內存分配。 因此,如果數組大小為10,則JVM內存中將分配40個字節。

    我的問題是這個40字節將分配到哪個區域(堆或堆棧)?

    我對數組的理解是:它就像任何其他對象一樣,駐留在堆區域下,但不知道數組指向的基元。

  2. 當數組保存引用時(例如,Employees類型的數組),也想知道類似的情況。 我認為在這種情況下,一切都將在堆區域。 由於這些是引用,因此數組將為每個引用(3​​2位系統)保存4個字節,並且這些引用將指向不同大小的對象。 數組內存分配將根據引用大小而非對象大小計算。

請幫助我清楚以上2點。

對象總是分配堆,因此您的dealCodes將僅在那里分配,但分配的總內存超過40個字節。

12 bytes (Header) + 4 bytes (Length of Array) + 40 bytes (4 bytes * 10 ints) = 56 bytes

同樣的事情也適用於Employee對象數組,除了每個數組元素現在都是對Employee對象的引用,因此employees數組占用的Shallow Heap仍然是56個字節,而Retained Heap依賴於每個Employee對象的大小。

您可以在JDK_HOME / bin目錄中使用VisualVM來獲取程序/應用程序的快照,查看每個對象占用的內存,包括淺層和保留堆大小。

  1. 我的問題是這個40字節將分配到哪個區域(堆或堆棧)?

堆分配。

請注意,將分配超過40個字節,因為Object頭+數組的length屬性有一些開銷。

如果您對此感興趣,可以使用Java Object Layout

當數組保存引用時(例如,Employees類型的數組),也想知道類似的情況。 我認為在這種情況下,一切都將在堆區域。 由於這些是引用,因此數組將為每個引用(3​​2位系統)保存4個字節,並且這些引用將指向不同大小的對象。

究竟。

引用的大小取決於體系結構,32位VS 64位以及CompressedOops的可能用途。

暫無
暫無

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

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