原语数组存储在 JVM 内存中的位置
Where array of primitives stored in JVM memory
JVM内存分为:
1.方法区
2.堆区
3.堆栈
4.电脑注册
5. 本机堆栈
现在假设我有一个 class 具有 属性 的说 "int[] dealCodes"(int 原语数组)。根据内存管理,一旦交易代码被初始化,内存中就会有连续的内存分配(total_elements * 4 字节)。因此,如果数组大小为 10,那么将在 JVM 内存中分配 40 个字节。
我的问题是这 40 个字节将分配在哪个区域(堆或堆栈)?
我对数组的理解是:它就像任何其他对象一样,位于堆区域下,但不知道数组指向哪个基元。
还想了解数组保存引用时的类似情况(例如 Employees 类型的数组)。我认为在这种情况下,一切都会在堆区。由于这些是引用,因此数组将为每个引用(32 位系统)保留 4 个字节,并且这些引用将指向不同大小的对象。
数组内存分配将根据引用大小而非对象大小进行计算。
请帮我弄清楚以上两点。
对象总是堆分配的,所以你的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
为您的 program/application 拍摄快照,查看每个对象占用的内存,包括浅堆和保留堆大小。
- My question is in which area this 40 bytes will be allocated (heap or stack)?
已分配堆。
请注意,将分配超过 40 个字节,因为 Object header + 数组的长度属性有一些开销。
如果你对此感兴趣,可以一起玩Java Object Layout
Also want to know about similar scenario when array holds references (e.g. array of type Employees). I think in this case, everything will be in heap area. As these are references then array will hold 4 bytes for each reference (32 bit system) and these references will point to objects of varying size.
完全正确。
引用的大小取决于体系结构、32 位与 64 位以及 CompressedOops 的可能用法。
JVM内存分为: 1.方法区 2.堆区 3.堆栈 4.电脑注册 5. 本机堆栈
现在假设我有一个 class 具有 属性 的说 "int[] dealCodes"(int 原语数组)。根据内存管理,一旦交易代码被初始化,内存中就会有连续的内存分配(total_elements * 4 字节)。因此,如果数组大小为 10,那么将在 JVM 内存中分配 40 个字节。
我的问题是这 40 个字节将分配在哪个区域(堆或堆栈)?
我对数组的理解是:它就像任何其他对象一样,位于堆区域下,但不知道数组指向哪个基元。
还想了解数组保存引用时的类似情况(例如 Employees 类型的数组)。我认为在这种情况下,一切都会在堆区。由于这些是引用,因此数组将为每个引用(32 位系统)保留 4 个字节,并且这些引用将指向不同大小的对象。 数组内存分配将根据引用大小而非对象大小进行计算。
请帮我弄清楚以上两点。
对象总是堆分配的,所以你的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
为您的 program/application 拍摄快照,查看每个对象占用的内存,包括浅堆和保留堆大小。
- My question is in which area this 40 bytes will be allocated (heap or stack)?
已分配堆。
请注意,将分配超过 40 个字节,因为 Object header + 数组的长度属性有一些开销。
如果你对此感兴趣,可以一起玩Java Object Layout
Also want to know about similar scenario when array holds references (e.g. array of type Employees). I think in this case, everything will be in heap area. As these are references then array will hold 4 bytes for each reference (32 bit system) and these references will point to objects of varying size.
完全正确。
引用的大小取决于体系结构、32 位与 64 位以及 CompressedOops 的可能用法。