Ich erstellte eine ArrayList von 1 Million MyItem Objekte und der Speicherbedarf war 106mb (vom Task-Manager überprüft) Aber nach dem Hinzufügen der gleichen Liste zu zwei weitere Liste durch addAll() -Methode, es dauert 259mb. Meine Frage ist, dass ich nur die Verweise auf Liste hinzugefügt habe, keine neuen Objekte werden danach 1 Million erstellt. Warum nimmt der Speicherverbrauch zu, obwohl LinkedList verwendet wurde (da es keine zusammenhängenden Speicherblöcke erfordert, so dass keine Neuzuweisung vorgenommen wird)?Speicherzuordnung in Sammlung von 1 Million Referenzen in Java
Wie erreichen Sie dies effizient? Die Daten durchlaufen verschiedene Listen in meinem Programm und verbrauchen mehr als 1 GB Arbeitsspeicher. Ein ähnliches Szenario ist oben dargestellt.
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
}
}
Die ArrayList-Basen, wie durch ihren Namen in einem Array angegeben. Wenn das Array ein neues Array zu klein wird, wird eine doppelte Größe erstellt und die Referenzen werden in das neue Array kopiert. Da Java über eine eigene Speicherverwaltung verfügt, wird der Speicher des ersten Arrays nur JVM intern freigegeben. – Robert