java - 原语数组存储在 JVM 内存中的位置

标签 java memory jvm

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

  1. 现在假设我有一个类,其属性为“int[] dealCodes”(int 原语数组)。根据内存管理,一旦交易代码被初始化,内存中就会有(total_elements * 4 字节)的连续内存分配。因此,如果数组大小为 10,那么将在 JVM 内存中分配 40 个字节。

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

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

  2. 还想了解数组包含引用时的类似情况(例如,类型为 Employees 的数组)。我认为在这种情况下,一切都会在堆区。由于这些是引用,因此数组将为每个引用(3​​2 位系统)保留 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 拍摄您的程序/应用程序的快照,查看每个对象占用的内存,包括浅堆和保留堆大小。

关于java - 原语数组存储在 JVM 内存中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29545115/

相关文章:

java - 如何修复控制查询持久化 QL(hql)

以编程方式启动 OSGi 框架时出现 java.util.NoSuchElementException

java - Android 应用内结算 - 如何多次购买单个应用内购买?

"value checking from list"程序中Java堆空间错误

java - Ant 可以同时启动两个 java 应用程序吗?

java - 如何修复 java.lang.UnsupportedClassVersionError : Unsupported major. 次要版本

Java - Jersey GET 请求返回 null;等效 URL 在浏览器中产生正确的输出

c - GCC 对堆栈中的 `array` 和 `&array` 使用相同的地址/指针

Java 虚拟机内部结构

c++ - C++中的手动内存管理