我創建了一個100萬個MyItem對象的ArrayList和消耗的內存是106MB(從任務管理器檢查)但通過addAll()方法添加到另外兩個列表後,它需要259mb。我的問題是我只添加了對列表的引用,在那100萬之後沒有創建新對象。爲什麼在使用LinkedList的情況下內存消耗會增加(因爲它不需要連續的內存塊,因此不會進行重新分配)?內存分配在100萬集合中的引用在java
如何有效實現這一目標?數據通過我的程序中的各種列表並消耗超過1GB的內存。上面介紹了類似的情況。
public class MyItem{
private String s;
private int id;
private String search;
public MyItem(String s, int id) {
this.s = s;
this.id = id;
}
public String getS() {
return s;
}
public int getId() {
return id;
}
public String getSearchParameter() {
return search;
}
public void setSearchParameter(String s) {
search = s;
}
}
public class Main{
public static void main(String args[]) {
List<MyItem> l = new ArrayList<>();
List<MyItem> list = new LinkedList<>();
List<MyItem> list1 = new LinkedList<>();
for (int i = 0; i < 1000000 ; i++) {
MyItem m = new MyItem("hello "+i ,i+1);
m.setSearchParameter(m.getS());
l.add(i,m);
}
list.addAll(l);
list1.addAll(l);
list1.addAll(list);
Scanner s = new Scanner(System.in);
s.next();//just not to terminate
}
}
ArrayList的基礎是它在數組上的名稱。如果數組太小而不能創建新數組,則會創建大小的兩倍,並將引用複製到新數組中。由於Java有它自己的內存管理,所以第一個數組的內存將僅在JVM內部釋放。 – Robert