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