0

无论我使用Long[],Integer[]还是ArrayList<Integer>, 为什么它们都返回相同的内存使用量?

System.out.println("Memory Usage : " + Runtime.getRuntime().totalMemory()/(1024*1024));
System.out.println("Memory Usage : " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/(1024*1024));

//Long[] aa = new Long[70000000];
Integer[] bb = new Integer[70000000];
//ArrayList<Integer> a = new ArrayList<Integer>(70000000);

System.gc();

System.out.println("Memory Usage : " + Runtime.getRuntime().totalMemory()/(1024*1024));
System.out.println("Memory Usage : " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/(1024*1024));
4

1 回答 1

6

在上述语句中,无论我使用 Long[]、Integer[] 还是 ArrayList,为什么它们都给出相同的内存使用量?

这很有意义。在所有情况下,您基本上都在分配一个 70000000 * (JVM 上的引用大小)的数组。参考的大小与Integer参考的大小相同,参考的大小与Long参考的大小相同Object。在这种ArrayList情况下,对象本身的额外开销非常小ArrayList,但这非常小 - 根据 Louis 的评论很容易解释。

如果您实际上填充了这些数组,创建了and的实例那么您会看到不同之处。同样,如果您创建了 a vs an ,您会看到不同之处。LongIntegerlong[]int[]

于 2012-11-30T15:37:50.897 回答