当前位置: 首页 > 知识库问答 >
问题:

基元数组存储在 JVM 内存中的位置

司马越
2023-03-14

JVM内存分为:1.方法区2.堆区3.堆栈4.PC寄存器5.本机堆栈

>

  • 现在假设我有一个属性为“int[]dealCodes”(int基元数组)的类。根据内存管理,一旦处理代码初始化,内存中就会有连续内存分配(total_elements*4字节)。所以,如果数组大小为10,则JVM内存中有40字节的分配。

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

    我对数组的理解是:它就像任何其他对象一样,驻留在堆区域下,但是不知道数组指向哪个原语。

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

    请帮我弄清楚以上两点。

  • 共有2个答案

    路和悌
    2023-03-14
      < li >我的问题是这40个字节会分配到哪个区域(堆还是栈)?

    堆已分配。

    请注意,将分配超过 40 个字节,因为 Object 标头的数组长度属性存在一些开销。

    如果你对此感兴趣,你可以玩Java对象布局

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

    没错。

    引用的大小取决于体系结构、32 位 VS 64 位以及压缩Oops 的可能用法。

    常永怡
    2023-03-14

    对象总是堆分配的,所以您的< code>dealCodes将只分配在那里,但是分配的总内存超过40字节。

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

    同样的情况也适用于Employee对象的数组,除了每个数组元素现在都是对employeeobject的引用,因此employees数组占用的浅堆仍为56字节,而保留堆取决于每个Employee对象的大小。

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

     类似资料:
    • 初始化数据段 BSS 堆栈 堆 代码 现在考虑以下程序: 在上面的程序中,arr和x都是在main函数内本地声明的。我认为这意味着它们都将在函数堆栈上分配空间。但是,当我在linux上运行size命令时,我发现实际上正在为数组分配数据段中的空间。

    • 问题内容: java中的一个int数组作为一个32位值块存储在内存中。如何存储整数对象数组?即 我以为Integer数组中的每个元素都是对Integer对象的引用,并且Integer对象与其他任何对象一样都具有对象存储开销。 但是,我希望JVM能够在底层实现一些神奇的功能,因为Integer是不可变的,并且像整数数组一样存储它。 我的希望真是天真吗?在性能至关重要的应用程序中,整数数组是否比整数数

    • 主要内容:程序员的幽默计算机要处理的信息是多种多样的,如数字、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式来表示。 要想学习编程,就必须了解二进制,它是计算机处理数据的基础。 内存条是一个非常精密的部件,包含了上亿个电子元器件,它们很小,达到了纳米级别。这些元器件,实际上就是电路;电路的电压会变化,要么是 0V,要么是 5V,只有这两种电压。

    • 问题内容: 我阅读了JVM内存模型,并对以下内容感到困惑: JVM是否将.class实例存储在其内存中。如果是,则在哪个区域。 就像在加载类后,JVM生成了机器级代码,然后开始执行机器代码指令,然后仅在堆上创建对象,并填充了方法区域。 perm gen等区域存储字节码还是机器级代码? 烫发与方法面积 我真的很感谢您对此主题的任何帮助。 谢谢。 问题答案: 1)文件将在加载时存储在permgen存储

    • 问题内容: 我有一个这样的数组声明: 这是原始类型的数组。该数组存储在哪里?它存储在堆还是堆栈上?这是一个原始类型,所有原始类型都不存储在堆上。 问题答案: 正如gurukulki所说,它存储在堆中。但是,你的帖子提出了一个误解,可能是由于一些善意的人传播了“原始生物始终存在”的神话。这是不正确的。局部变量在堆栈上有其值,但并非所有原始变量都是局部的… 例如,考虑一下: 现在,住在哪里?神话暗示它

    • 我使用一个java jdbc应用程序从DB中获取大约500,000条记录。使用的数据库是Oracle。当每一行被取出时,我就将数据写入文件。由于获取整个数据需要大约一个小时,所以我尝试增加结果集的获取大小。我在多个链接中看到,在增加读取大小的同时,应该小心内存消耗。增加读取大小实际上会增加jvm使用的堆内存吗?< br >假设提取大小为10,程序查询总共返回100行。在第一次提取期间,结果集包含1