Я создал ArrayList из 1 миллиона объектов MyItem, а потребляемая память была 106mb (отмечена в диспетчере задач). Но после добавления того же списка в еще два списка с помощью метода addAll() он занимает 259 мб. Мой вопрос заключается в том, что я добавил только ссылки на список, после этого не создаются новые объекты. 1 миллион. Почему увеличение потребления памяти происходит, хотя LinkedList был использован (поскольку он не требует смежных блоков памяти, чтобы не было перераспределения)?выделение памяти в коллекции 1 млн ссылок в java
Как достичь этого эффективно? Данные проходят через различные списки в моей программе и потребляют более 1 ГБ памяти. Аналогичный сценарий представлен выше.
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 internal. – Robert