2016-04-24 4 views
-2
HashMap obj = new HashMap(); 
for(int i=0;i<1000;i++) { 
    obj = getObjects(i); 
} 

Wird dieser Code verursacht einen Speicherverlust in dieser Zeile "obj = getObjects (i);"?Java-Speicherverbrauch - ist diese Syntax korrekt oder wird ein Speicherverlust verursacht?

Ich bin mir nicht sicher, ob die alten Werte von obj freigegeben werden, oder wenn sie noch den Speicher.

Wenn dies ein Speicherverlust ist, was ist die korrekte Syntax?

+0

Die HashMap, die obj auf hinwies, bevor die Zuweisung Müll gesammelt bekommen würde, da es keine Hinweise darauf sein wird, aber es gibt keine Garantie, dass es, sobald die Zuordnung erfolgt passieren wird. Garbage Collection wird schließlich passieren. – Madhusudhan

+0

Bitte verwenden Sie keine Rohtypen wie HashMap. – Madhusudhan

Antwort

1

In Java gibt es eine Garbage Collector, so normalen Betrieb mit wie diese es ziemlich schwierig ist, ein Speicherleck zu verursachen. Der Garbage Collector geht herum und befreit jeden Speicher, der nicht mehr referenziert wird.

Mehr Informationen zu Garbage Collection: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Die kurze Antwort ist, dass der Code nicht ein Speicherleck verursachen sollte.

0

Eine Referenz oder ein Objekt wird nicht "freigegeben", wenn es überschrieben wird. Es gibt keine Arbeit mehr bei der Zuweisung einer Referenz, wenn man einer Variablen int zuweist.

die Statt die alte Referenz einfach nicht mehr existiert, und GC sucht nach Referenzen, die noch vorhanden ist.

0

Wird dieser Code an dieser Zeile ein Speicherleck verursachen "obj = getObjects (i);"?

Es ist unmöglich zu sagen, sicher. Sie haben uns den Code für getObjects nicht angezeigt, und es ist möglich (obwohl nicht wahrscheinlich, basierend auf dem Namen der Methode), dass diese Methode einen internen Speicherverlust haben könnte.

jedoch wiederholt Verweise auf eine einfache variable Zuweisung (z.B. obj) nicht Speicher austreten.

Ich bin nicht sicher, ob die alten Werte von obj freigegeben sind oder ob sie noch den Speicher verwenden.

Es ist nicht so einfach an, dass:

  • aus einer Speichermanagementperspektive, die „alten Werte von obj“ Referenzen sind ... keine Objekte.
  • Die Objekte, auf die sich diese Referenzen beziehen, werden nicht sofort freigegeben, wenn Sie obj eine andere Referenz zuweisen.
  • Sie werden schließlich in der Zukunft durch den GC freigegeben werden, sofern:
    • genügend Speicherplatz vorhanden ist Druck den GC laufen für den „Raum“, wo die Objekte zugeordnet wurden, und
    • zu verursachen nichts anderes verweist auf die Objekte.

Wenn dies ein Speicherleck ist, was ist die richtige Syntax?

Für die Aufzeichnung sind Speicherverluste kein Syntaxproblem.

0

Ich machte einen Test und ist in Ordnung, Java wird regelmäßig Speicher freigeben. Ich habe immer noch HashMap verwendet, um meinen Anwendungskontext zu reproduzieren.

package memtest; 

import java.util.HashMap; 

public class MemTest { 
    public static void main(String[] args) throws InterruptedException { 
     HashMap obj = new HashMap(); 
     int loop = 1; 
     while(true) { 
      HashMap newObj = new HashMap(); 
      newObj.put("1", "big string that is not pasted here"); 
      obj = newObj; 
      System.err.println("At loop "+loop); 
      Thread.sleep(1000); 
      loop++; 
     } 
    }  
} 
Verwandte Themen