如何计算java数组内存的使用情况

如果我有:

int c[] = new int[10]; 

 int a[][] = new int[2][3]; 

一般来说

一个n*m*..*j数组

如何考虑参考变量,我如何计算实际内存使用量?

如果你想要一个准确的答案,你不能。 至少没有任何简单的方法。 这个post解释了更多。

Bragaadeesh和Bakkal答案的麻烦在于它们忽略了开销。 每个数组还存储诸如它具有的维数,它有多长以及垃圾收集器使用的一些东西之类的东西。

对于一个简单的估计,你可以使用其他答案的计算并添加100-200字节。

我知道我有点迟到了,但计算内存占用并不是很难。

让我们举一个例子: int c[] = new int[N];

根据64位内存模型,int是4个字节,因此所有元素的大小都是4 * N字节。 除此之外,Java有24字节的数组开销,实际的数组对象也有8个字节。 所以这总共是32 + 4 * N字节。

对于二维数组: int a[][] = new int[N][M];

它基本上是相同的,只是第一个数组中的每个元素都是另一个大小为M的数组,所以不是4而是32 + 4 * M,所以总大小是32 +(32 + 4 * M)* N.

确实,D维的推广非常复杂,但你明白了。

int[]int[][]不是原始数据类型。 它是Java中的Object。 使用对象,无法立即计算大小。

你可能会得到最好的近似值: http : //java.sun.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize(java.lang.Object)

本文和这篇全面的 文章演示/详述了这种方法

原始类型:基本类型和字节大小

  • 布尔值1
  • 字节1
  • char 1
  • int 4
  • 漂浮4
  • 长8
  • 双8
  • Interger 24(Class实例为16 + int为4 +内存对齐为4)

int a [M]:24 + 4M

(16为Class + 4为保存数组大小+ 4为内存对齐)+(对于M大小为double,我们需要4 * M)

int [M] [N] 🙁 24 + 4M)+ M *(24 + 4N)= 24 + 28M + 4MN ~~~ 4MN

将[M] [N]视为双数组的M大小a [N]加上一个额外数组以保存所有M大小数组起始点的引用。