如何计算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大小数组起始点的引用。