我知道Java的实现尽其所能隐藏开发人员的信息,但我正在构建一个不依赖于第三方库的内存限制算法,因此信息会派上用场。
特别是,我将许多大int[]
数组分配为实例变量。我将很快调查更紧凑的表示,但是现在我有兴趣知道对于普通数组使用了多少空间。
答案 0 :(得分:9)
好吧,由于填充,int
字段 最终会占用超过4个字节...但基本上它是4个字节(32位)。至于 是否需要超过4个字节,你必须尝试找出答案。这对于对象内的字段来说相当容易;基于堆栈的int
值更难。
例如,大量的int
总是占用其长度的大约4倍(+长度等的少量开销)。我不相信会在元素之间应用填充 - 尽管验证它会相对容易。 Runtime.totalMemory() - Runtime.freeMemory()
返回的值只能小心使用,但是如果你在一次运行中分配一百万个整数的数组,那么在另一个运行中分配200万个整数,然后是300万个整数,那么它应该相当清楚发生了什么
示例代码:
public class Test {
public static void main(String[] args) {
int size = Integer.parseInt(args[0]);
long before = getUsedMemory();
int[] array = new int[size];
long after = getUsedMemory();
long difference = after - before;
System.out.println("Total difference: " + (after - before));
System.out.println("Per element: " + ((double) difference) / size);
System.out.println(array); // Make sure the array isn't GC'd early
}
private static long getUsedMemory() {
Runtime rt = Runtime.getRuntime();
return rt.totalMemory() - rt.freeMemory();
}
}
在我的机器上,尝试使用100000,2000000和3000000为所有运行提供“4 * size + 16”字节。
答案 1 :(得分:4)
只是int
本身?这可能取决于它毗邻的等等。或者你的意思是int
的数组?我99%肯定会在所有合理的JVM实现中占用4个字节(加上数组对象本身的一些固定开销)。
long before = Runtime.getRuntime().freeMemory();
int foo[] = new int[123456];
System.out.println("Approximate bytes per int: "
+ (before - Runtime.getRuntime().freeMemory())/(float)123456);
报告:
每个int的近似字节数:4.0001945
答案 2 :(得分:0)