webForumDet fria alternativet

Minnesläcka i HashMap

Java

3 svar · 243 visningar · startad av andreascarlsson

Medlem sedan feb. 2003202 inlägg
Frågan#1

Jag har en liten minnesfundering... :q

Om jag sparar ett flertal objekt i en HashMap och sedan nullar HashMap-objektet, frigörs då även de objekt som är sparade i HashMap-objektet??

Kommer GarbageCollectorn att "käka upp" dessa objekt, eller anser den att det fortfarande finns referenser kvar till de objekt som var lagrade i HashMap-objektet?

M.a.o. kommer jag att få ett minnesläckage i följande kod?:

public void fooBar()
{
   HashMap hashmap = new HashMap()
   
   for(int i=0; i<1000; i++)
      hashmap.put("key" + i, new ObjectOfSomeKind());

   hashmap = null;
}

Om det skulle vara så att det uppstår ett minnesläckage, hur bör man då frigöra dessa objekt?

Medlem sedan dec. 2000399 inlägg
#2

Dessa objekt borde städas undan av GC:n, det finns ju inga referenser till dem längre (i ditt exempel). Kolla denna artikel för lite mer info:
http://www.javaworld.com/javaworld/jw-08-1996/jw-08-gc.html

Medlem sedan feb. 2003202 inlägg
#3

Ok!

Tack för infon.

Medlem sedan sep. 2001961 inlägg
#4

Ja, de städas upp av GC:n. Jag sitter i ett projekt där den som har designat systemet verkar älska HashMap och har via empiriska undersökningar konstaterat att det i många fall, om man har stora HM:ar, är mer effektivt att nulla alla objekt i HM:en och sedan nulla själva HM-referensen. GC:n har då enklare att städa bort objekten, framför allt om man kör med floor-algoritmen i GC:n.

Om prestanda inte är nödvändigt så strunta i det.

/Lime

258 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)