无论我使用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));

最佳答案

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


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

如果您实际上填充了这些数组,并创建了LongInteger的实例,那么您会发现有所不同。同样,如果您创建了long[]int[],则会发现差异。

10-05 22:51
查看更多