在Object 中为元素分配多少内存
考虑以下情况
int[] anArray = new int[10];
在堆上为每个32位的 10个元素分配内存。对吗?
那么如果元素类型是Object,那么元素的大小是多少。 ??
喜欢
Object[] objArray = new Object[10];
堆上现在分配了多少内存? 我只是怀疑ArrayList
的源代码。
private transient Object[] elementData;
刚在我的机器上尝试过这一行
List s = new ArrayList(Integer.MAX_VALUE);
结果
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit at java.util.ArrayList.(Unknown Source) at com.nextenders.server.guice.actions.servlets.Test.main(Test.java:13)
所以我想知道分配了多少内存。
那么如果元素类型是Object,那么元素的大小是多少。 ??
Object[]
数组元素的大小是引用的大小。
-
在32位JVM上,引用是32位(4字节)
-
在64位JVM上,如果启用了“压缩oop”优化且堆大小小于32Gb,则引用为64位(8字节)或32位。
因此,您的数组分配将分配一个包含大约4 x 10或8 x 10字节的堆对象…以及大约12字节的对象头开销。
刚在我的机器上尝试过这一行
List s = new ArrayList (Integer.MAX_VALUE);
您将尝试分配尝试分配包含2 33到2 34个字节的数组。 使用32位JVM,保证不起作用。 使用64位JVM,您需要至少8Gb(压缩oop)或16Gb的堆才能工作。
- 10 x 4bytes = 40个字节
- 对象存储的最大大小是256 MB可压缩,非易失性RAM存储。 可以更改对象库的大小,以自定义应用程序及其相关数据可用的持久存储量。 默认对象= x32bit中的4bytes和x64bit中的8bytes
- 这取决于物品的物品。 由于您没有在对象中分配任何项目,因此默认情况下将计算堆对象= 4bytes x 10 = 40bytes。
它将创建一个由对象(存储对象的存储器地址)的10个32位引用组成的数组,因为java中的所有对象只是指向存储对象的内存的指针。 或者,如果您使用的是64位计算机,则地址将为64位