Avatar billede cvpcvp Nybegynder
23. marts 2004 - 13:25 Der er 12 kommentarer og
1 løsning

LinkedList sluger hukommelse

jeg har oprettet en linked list:

private LinkedList grafContent;

grafContent = new LinkedList();

nå der sker en event bliver værdien af eventen lagt ned i min LinkedList:
grafContent.add(new Double(value));

Mit problem er nu at jeg tilføjer ret mange elementer til listen, men selv om jeg sletter nogle af de første elementer når det er at listen er ved at blive lang bliver den hukommelse den har taget ikke frigivet igen.
Hukommelsen bliver heller ikke frigivet hvis jeg kalder clear på listen.

Hvordan sørger jeg få at hukommelsen bliver frigivet igen når elementet ikke længere eksisterer i listen?
Avatar billede Slettet bruger
23. marts 2004 - 13:30 #1
Har du prøvet at kalde System.gc() efter du har fjernet elementerne ?
Avatar billede arne_v Ekspert
23. marts 2004 - 13:32 #2
Er pladsen ikke tilgængelig for nye Java objekter ? Eller bliver pladsen
ikke frigivet fra JVM til operativ systemet ?
Avatar billede cvpcvp Nybegynder
23. marts 2004 - 13:34 #3
Har jeg lige prøvet.... det har ingen effekt....
Avatar billede cvpcvp Nybegynder
23. marts 2004 - 13:37 #4
umiddelbart tror jeg ikke at pladsen er tilgængelig for nye java objekter. Er ikke så hård til hvad der egentlig sker. Jeg opdagede bare at systemet kørte meget langsomt efter jeg havde kørt dette kode, og jeg kunne så se i en systemmonitor at hukommelsen ikke blev frigivet før jeg lukkede programmet.
Avatar billede Slettet bruger
23. marts 2004 - 13:38 #5
Hov, ja.....arne_v har jo egentligt ret i det han siger...... hvis en LinkedList har allokeret X antal bytes hukommelse, så frigiver den vel ikke hukommelsen, det er kun antallet af elementer (i listen) som er mindre. Det er vel også derfor man kan initialisere Collection-klasser med x-antal pladser (så den ikkke allokerer mere hukommelse end det er strengt nødvendigt)
Avatar billede arne_v Ekspert
23. marts 2004 - 13:43 #6
Implicit garbage collection eller eksplicit med System.gc vil
fjerne objekter som der ikke er reference til længere og gøre
pladsen tilgængelig for nye Java objekter.

Når Java mangler plads allokerer den mere plads fra styre systemet (Windows).
Men den frigiver ikke plads når den ikke længere skal bruge det. D.v.s. uanset
hvormeget du fjerner af objekter og garbage collecter, så bliver memoryen
kun tilgængelig inde i samme JVM ikke for andre programmer (selvom jeg formoder at
den kan pages ud).
Avatar billede arne_v Ekspert
23. marts 2004 - 13:44 #7
corholio>

Collection objektet beholder sikkert et array til at holde referencer. Men de
objekter som referencerne før pegede på må alligevel blive GC'et.
Avatar billede cvpcvp Nybegynder
23. marts 2004 - 13:48 #8
Hvordan løser jeg så mit problem?
Avatar billede arne_v Ekspert
23. marts 2004 - 13:57 #9
Du må nok enten leve med memory forbruget.

Eller ændre lidt i din data struktur.
Avatar billede arne_v Ekspert
23. marts 2004 - 13:59 #10
Jeg er overbevist om at:

double[] data;
int n;

bruger betydeligt mindre plads.

Eventuelt måske:

float[] data;
int n;

Du skal så selv kopiere data når du udvider elle krymper data, men
det er vel også til at leve med.
Avatar billede arne_v Ekspert
23. marts 2004 - 22:19 #11
Giver det mening ?
Avatar billede cvpcvp Nybegynder
24. marts 2004 - 09:20 #12
ja det gør det. jeg har lavet en ringbuffer af min linkedList i stedet for.
Avatar billede cvpcvp Nybegynder
24. marts 2004 - 09:21 #13
men tak for hjælpen anyway....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester