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

aba*_*gat 2 java memory memory-management

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

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

Jon*_*eet 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,尝试使用100000,2000000和3000000为所有运行提供"4*size + 16"字节.