Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 其中存储在JVM内存中的原语数组_Java_Memory_Jvm - Fatal编程技术网

Java 其中存储在JVM内存中的原语数组

Java 其中存储在JVM内存中的原语数组,java,memory,jvm,Java,Memory,Jvm,JVM内存分为: 1.方法区 2.堆区 3.堆栈 4.PC寄存器 5.本机堆栈 现在假设我有一个类的属性是“int[]dealCodes”(int基元数组)。根据内存管理,一旦交易代码被初始化,内存中将有连续的内存分配(总元素*4字节)。所以,如果数组大小为10,那么JVM内存中将分配40个字节 我的问题是这40个字节将分配到哪个区域(堆还是堆栈) 我对数组的理解是:它和任何其他对象一样,位于堆区域下,但不知道数组指向的原语 还想知道数组包含引用时的类似场景(例如,Employees类型的数组)

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

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

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

    我对数组的理解是:它和任何其他对象一样,位于堆区域下,但不知道数组指向的原语

  • 还想知道数组包含引用时的类似场景(例如,Employees类型的数组)。我想在这种情况下,所有的东西都会在堆区域。由于这些是引用,所以数组将为每个引用(32位系统)保存4个字节,并且这些引用将指向不同大小的对象。 阵列内存分配将根据参考大小而不是对象大小进行计算


  • 请帮助我澄清以上两点。

    对象始终是堆分配的,因此您的
    dealcode
    将 仅在此处分配,但分配的总内存超过40字节

    12 bytes (Header) + 4 bytes (Length of Array) + 40 bytes (4 bytes * 10 ints) = 56 bytes
    
    同样的情况也适用于
    Employee
    对象的数组,只是每个数组元素现在都是对Employee对象的引用,因此employees数组占用的
    浅堆仍然是56字节,而
    保留的堆取决于每个Employee对象的大小

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

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

    请注意,将分配40多个字节,因为数组的objectheader+length属性有一些开销

    如果你对此感兴趣,你可以玩

    还想知道数组包含引用时的类似场景(例如,Employees类型的数组)。我想在这种情况下,所有的东西都会在堆区域。由于这些是引用,所以数组将为每个引用(32位系统)保存4个字节,并且这些引用将指向不同大小的对象

    没错


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

    从JDK7开始,默认情况下会启用CompresseDoop,并且它们仅适用于小于32 GBs的堆,请注意:)是的,对于大多数用法,默认情况下会启用,但内存占用仍然取决于CompresseDoop用法:)True,在Java6之前,该标志实际上有助于减少64位JVM中的对象头大小,但现在(Java7和Java8),只要64位虚拟机的容量限制在32GB以内,您就不必担心它:)Arkantos&Clément。。。感谢你们两位澄清了我的疑问…非常清楚的解释…-)数组是对象,所以它在heapArkantos&Clément上。。。感谢你们两位澄清了我的疑问…非常清楚的解释…-)