一个int对Sun的64位JVM有多少内存?

时间:2011-02-23 07:00:43

标签: java memory memory-management

我知道Java的实现尽其所能隐藏开发人员的信息,但我正在构建一个不依赖于第三方库的内存限制算法,因此信息会派上用场。

特别是,我将许多大int[]数组分配为实例变量。我将很快调查更紧凑的表示,但是现在我有兴趣知道对于普通数组使用了多少空间。

3 个答案:

答案 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)