当我将2MB对象Foo bar
放入Collection<Foo>
时,现在内存中有4MB Foo
还是只有2MB?
e.g。
Foo twoMBObject = new Foo();
ArrayList<Foo> bax = new ArrayList<>();
bax.add(twoMBObject);
/* Do we now have bax-twoMBObject & twoMBObject or just twoMBObject
and a pointer to twoMBObject in the list? */
修改
我很难搞清楚建议的重复问题是否实际上是重复的。虽然接受的答案没有回答这个问题,但其中一个答案就是答案。我不确定如何继续这里。
答案 0 :(得分:4)
你有2MB因为你只是添加对象的引用而不创建对象的副本。
测试方法的简便方法是使用Runtime.getRuntime().totalMemory()
方法。例如:
public static void main(String[] args) {
Byte[] b = new Byte[1000];
Runtime runtime = Runtime.getRuntime();
long allocatedMemory = runtime.totalMemory() - runtime.freeMemory();
System.out.println(allocatedMemory);
List<Byte[]> collection = new ArrayList<>();
collection.add(b);
allocatedMemory = runtime.totalMemory() - runtime.freeMemory();
System.out.println(allocatedMemory);
}
答案 1 :(得分:2)
现在内存中有4MB的Foo还是只有2MB?
2 MB,因为当你执行new Foo()
时,会分配2MB的空间并返回对该对象的引用。现在当你bax.add(twoMBObject);
时,你实际上是在添加对ArrayList的引用而不是创建一个“new”对象。
如果您尝试使用引用twoMBObject
更改对象中的内容,您将看到添加到ArrayList
的对象中反映的更改。这证明它是同一个对象。