其中基元数组存储在JVM内存中

时间:2015-04-09 17:27:31

标签: java memory jvm

JVM内存分为: 1.方法区 2.堆区 3.堆叠 4. PC注册 5.原生堆栈

  1. 现在假设我有一个具有say" int [] dealCodes"(int primitive of array)属性的类。根据内存管理,一旦交易代码被初始化,内存中将存在(total_elements * 4字节)的连续内存分配。因此,如果数组大小为10,则JVM内存中将分配40个字节。

    我的问题是这个40字节将分配到哪个区域(堆或堆栈)?

    我对数组的理解是:它就像任何其他对象一样,位于堆区域下,但不知道数组指向的基元。

  2. 当数组保存引用时(例如Employees类型的数组),也想知道类似的情况。我认为在这种情况下,一切都将在堆区域。由于这些是引用,因此数组将为每个引用(3​​2位系统)保存4个字节,并且这些引用将指向不同大小的对象。 数组内存分配将根据引用大小而非对象大小计算。

  3. 请帮助我明确以上2点。

2 个答案:

答案 0 :(得分: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 1}}取决于每个Employee对象的大小。

您可以在JDK_HOME / bin目录中使用VisualVM来获取程序/应用程序的快照,查看每个对象占用的内存,包括浅层和保留堆大小。

答案 1 :(得分:2)

  
      
  1. 我的问题是这个40字节将分配到哪个区域(堆或堆栈)?
  2.   

已分配堆。

请注意,将分配超过40个字节,因为Object头+数组的length属性有一些开销。

如果您对此感兴趣,可以使用Java Object Layout

  

当数组保存引用时(例如,Employees类型的数组),也想知道类似的情况。我认为在这种情况下,一切都将在堆区域。由于这些是引用,因此数组将为每个引用(3​​2位系统)保存4个字节,这些引用将指向不同大小的对象。

完全。

引用的大小取决于体系结构,32位VS 64位以及CompressedOops的可能用法。