Ich habe ein folgenden Code:Java Garbage Collection und null
List<String> list = new ArrayList<String>();
// WeakReference<List> wr = new WeakReference<List>(list);
System.out.println(" before tot memory... " + Runtime.getRuntime().totalMemory());
System.out.println(" before free memory... " + Runtime.getRuntime().freeMemory());
for(int i =0; i<100; i++)
list.add(new String("hello"));
//System.gc();
list = null; //forcefully end its life expectancy
System.out.println(" after tot memory... " + Runtime.getRuntime().totalMemory());
System.out.println(" after free memory... " + Runtime.getRuntime().freeMemory());
System.out.println(" after memory used ... " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
// System.out.println(" weak reference " + wr.get());
Wenn ich den obigen Code ausführen, kann ich den freien Speicher sehen ist 361.064 (In meinem System, aber dieser Wert kann variieren)
Aber wenn ich den obigen Code mit System.gc() und Kommentar list = null, kann ich sehen, meine freie Speicher kommt (160944 in diesem Fall) weniger als die oben genannten Testfall. In beiden Szenarien werden die Objekte aus dem Speicher entfernt. Warum unterscheiden sich diese Werte?
'new String (" hallo ")' erstellt zwei Objekte. Dieser Konstruktor sollte niemals verwendet werden. Versuchen Sie 'list.add (" Hallo ")' –
@ajozwik Ich würde nicht sagen "nie". Es gibt gültige Anwendungsfälle dafür. Deshalb existiert es. – EJP