对于那些急于将其标记为重复的人来说,这个问题与以下任何问题都无关:
int
在 Java 中,创建原始数组时:
int[] arr = new int[1000];
在上述语句之后,JVM 是否会为整个数组长度 * 4 个字节(即 4000 个字节)分配内存?我们不必担心诸如标头等常量开销。
我的理解是,对于原始数字类型,例如int
等double
,默认值“0”也是有效值,因此需要内存。实际上,在进行此类声明时必须分配所需的全部内存。
我该如何验证呢?
对于那些急于将其标记为重复的人来说,这个问题与以下任何问题都无关:
int
在 Java 中,创建原始数组时:
int[] arr = new int[1000];
在上述语句之后,JVM 是否会为整个数组长度 * 4 个字节(即 4000 个字节)分配内存?我们不必担心诸如标头等常量开销。
我的理解是,对于原始数字类型,例如int
等double
,默认值“0”也是有效值,因此需要内存。实际上,在进行此类声明时必须分配所需的全部内存。
我该如何验证呢?
让我们来看看
我们可以看到,除了处理方法调用本身(即堆栈操作)的指令之外,C2 为该
test
方法生成的代码还包含两条指令,mov %edx,%eax
和add $0x123,%eax
。没有数组分配,也没有数组清零。当然,这是最极端的情况。但它表明,只要结果行为兼容,就没有必要按照字面意思去做。
除此之外,“分配”一词含义模糊。它意味着更改某些数据结构以记录特定内存区域不可用于其他目的。但共享此结构的人有所不同,因此,对于分配的内容的看法也相同。
小型分配通常在专用于单个线程的TLAB中完成。因此,在 TLAB 中分配小型数组只会对该线程产生影响。从其他线程的角度来看,该 TLAB 的内存无论如何都不可用。但即使从所有线程共享的堆内存中分配了新的 TLAB,从操作系统的角度来看,该内存也被视为已为 JVM 进程保留。只有当 JVM 扩展或收缩整个堆内存时,它才会影响操作系统为 JVM 保留的内容(这可能会对其他进程产生影响)。
但即使内存是从操作系统分配的,也不必由物理内存支持。操作系统可能会将此操作推迟到第一次实际写入操作发生时。在此之前,内存可能仍被视为全零填充,这是典型的默认设置,系统不需要实际内存来填充全零区域。
是的,JVM 确实一次分配所有内存。
Java 会按照你说的做,还有一点就是内存需要连续,因为arrar的数据是连续的,所以初始化数组的时候需要分配满,如果没有连续的内存,就会出现out of mem。
数组本身需要一些空间,但只有大约 4 到 8 个字节。
例如:我将为 A 分配可容纳 100 辆车的停车位。并在 A 的后面为 B 分配可容纳 50 辆车的停车位。
即使 A 可能还没有全部 100 辆车,但我需要知道每辆车的确切尺寸,以便准确计算 100 辆车为 A 提供停车位所需的空间。对于 A 后面的 B 也是如此。