将项添加到集合的实际内存影响

时间:2016-01-20 18:20:47

标签: java

当我将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? */

修改
我很难搞清楚建议的重复问题是否实际上是重复的。虽然接受的答案没有回答这个问题,但其中一个答案就是答案。我不确定如何继续这里。

2 个答案:

答案 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的对象中反映的更改。这证明它是同一个对象。