【发布时间】:2016-09-10 16:49:53
【问题描述】:
我创建了一个包含 100 万个 MyItem 对象的 ArrayList,消耗的内存为 106mb(从任务管理器检查)但是通过 addAll() 方法将相同的列表添加到另外两个列表后,它需要 259mb。我的问题是我只添加了对 list 的引用,在那一百万之后没有创建新对象。为什么即使使用了 LinkedList 内存消耗也会增加(因为它不需要连续的内存块,所以不会进行重新分配)?
如何有效地实现这一目标?数据通过我的程序中的各种列表并消耗超过 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 内部释放。
标签: java memory-management arraylist reference linked-list