如何计算java阵列内存使用率
如果我有:
int c[] = new int[10];
及
int a[][] = new int[2][3];
大体上
一个n*m*..*j
数组
考虑到引用变量,如何计算实际内存使用率
你可以在下面搜索框中键入要查询的问题!
如果我有:
int c[] = new int[10];
及
int a[][] = new int[2][3];
大体上
一个n*m*..*j
数组
考虑到引用变量,如何计算实际内存使用率
# 1 楼答案
我知道我去派对有点晚了,但计算内存占用真的不是很难
让我们以你的第一个例子:
int c[] = new int[N];
根据64位内存模型,int是4字节,所以所有元素的大小都是4*N字节。除此之外,Java还有24字节的数组开销,还有8字节用于实际的数组对象。总共是32+4*N字节
对于二维数组:
int a[][] = new int[N][M];
基本上是一样的,第一个数组中的每个元素是另一个大小为M的数组,所以我们用32+4*M代替了4,所以总大小是32+(32+4*M)*N
的确,D维的泛化非常复杂,但你明白了
# 2 楼答案
int[]
或int[][]
不是原始数据类型。它是Java中的一个对象。对于一个物体,它的大小不能直接计算出来# 3 楼答案
如果你想要一个准确的答案,你不能。至少不能以任何简单的方式This thread解释了更多
Bragaadeesh和Bakkal的答案的问题在于他们忽略了开销。每个数组还存储诸如其维数、长度以及垃圾收集器使用的一些内容
对于一个简单的估计,使用其他答案的计算结果并添加100-200字节就可以了
# 4 楼答案
对于原始类型:基类型和字节大小
INTA[M]:24+4M
(16类+4用于存储数组大小+4用于内存对齐)+(对于双精度的M大小,我们需要4*M)
inta[M][N]:(24+4M)+M*(24+4N)=24+28M+4MN~~~4MN
将a[M][N]视为双数组a[N]的M大小加上一个额外数组,以保存所有M大小数组起点的引用
# 5 楼答案
你可能会从中得到最好的近似值:http://java.sun.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize(java.lang.Object)
这个article和这个comprehensive one演示/详细说明了这种方法
# 6 楼答案
我知道这是一个老问题,但我也有同样的问题,这篇文章中给出的信息对我没有帮助。提供我所需信息的消息来源:https://www.javamex.com/tutorials/memory/array_memory_usage.shtml
我的情况是:我有一个大数组
其中“大”实际上是误导性的:m是大的(3^18=387420489),但n是小的(4)。我一直遇到我不理解的内存问题,因为m*n*4=6198727824(~6GB),而我有16GB的RAM(允许使用-Xmx12G的JVM使用12个)。我刚才的链接给了我答案:
这就是我的二维数组的内存基本上偏离了4*m*n的地方:这里,因为n很小(4),所以每一行的大小实际上与4*n不同;如果应用链接中给出的公式(即使它是近似值),每行得到:12(标题)+4*4(四个整数)+4(填充到8字节的倍数)=32。这是我预期成本的两倍,并说明我遇到了内存溢出