Avatar billede mulemule Nybegynder
22. oktober 2005 - 15:11 Der er 10 kommentarer

Ram bliver fyld op,

Jeg har et større system, som kører døgnet rundt i test.

Jeg har fundet ud af (det overraskede mig ikke) at der langsomt sker en opfyldning af Ram.

Jeg ved at det skyldes at der hele tiden oprettes nye instanser af klasser, som jo aldrig bliver nedlagt igen.

Hvordan sikrer jeg mig at der ikke sker denne opfyldning af ram.

Er det nok løbende at sørge for at der kun er refferencer til objecter der er i brug. Og at alle forældende objecter ikke reffereres fra noget sted ?

Eller skal man også finalise objecterne.

Mvh
Avatar billede nielle Nybegynder
22. oktober 2005 - 15:29 #1
Hvis du ikke nedlægger dine klasser igen, så får du ikke frigivet din RAM. Det er der ingen kur imod.
Avatar billede arne_v Ekspert
22. oktober 2005 - 16:16 #2
Hvis ingen referencer der er til objekter så bliver de garbage collectet.

Husk at ikke managed ressourcer altid skal closes/disposes.
Avatar billede tuxic Nybegynder
22. oktober 2005 - 20:21 #3
Hvordan kan det være instanserne ikke bliver nedlagt igen? Holder du fx statiske referencer til dem?
Får du outofmemoryexceptions? Jeg har set .NET apps hvor hukommelsesforbruget svinger voldsomt (fx hvis man får flyttet meget over i gen 2). Med andre ord, er du sikker på at der er en leak?
Er der pinnede objecter? De kan give anledning til fragmentering af hukommelsen og risikere at give outofmemoryexceptions selvom der er masser af fri plads (de kan jo ikke flyttes så heap'en kan ikke kompaktes og allokering sker altid på toppen af heapen).
Avatar billede mulemule Nybegynder
24. oktober 2005 - 14:18 #4
Det er simpelthen fordi min kode husker en masse refferencer til objecter som det ikke længere har brug for. Så der er ikke noget mystisk i det.

Men altså hvis jeg bare fjerner refferencerne, hvad så hvis det object der skal carbage collectes selv refferer et object som reffererer tilbage til det første object.. Bliver det hele så betragtet som en "død" del af koden, og carbage collected automatisk?. Og hvordan kan .NET egentlig vide at noget kode er dødt, det kan da ikke være helt let at gennemskue, jeg tænker på Threads og metoder der returnere med det samme etc.

?? Kan dette spm overhovedet forståes ?

Tak for hjælpen indtil videre.
Avatar billede arne_v Ekspert
24. oktober 2005 - 14:21 #5
Den finder selv ud af om der er noget af den kørende kode der kan få fat i det
og hvis ikke så GC'es det hele.

Nej det er nok ikke helt nemt at kode, men det problem har Microsoft altså
fået løst.
Avatar billede nielle Nybegynder
24. oktober 2005 - 18:19 #6
Det er nu under alle omstændigheder pænere kodestil at selv nedlægge objekterne frem for at blot lade dem gå ud af scope og så lade GC om at rydde op.
Avatar billede arne_v Ekspert
24. oktober 2005 - 19:54 #7
hvus du hentyder til:

a = null;
b = null;
c = null;

stilen så er jeg meget uenig.

Det tilføjer en masse overflødige linier til koden.

Og det giver sandsyneligvis ikke hurtigere GC og giver sandsyneligvis større CPU
forbrug (omend begeg dele afhænger meget af GC implementeringen).

Derfor vil man normalt kun anbefale explicit null'ing i specielle situationer.

Der er ikke skrevet så meget om det for C# - Google kune kun finde
http://blogs.msdn.com/csharpfaq/archive/2004/03/26/97229.aspx, men der er skrevet
meget om det i Java (og problem stillingen er helt den samme).
Avatar billede tuxic Nybegynder
24. oktober 2005 - 20:27 #8
mulemule: Pointen med A peger på B der peger på A er god. Det er præcis derfor der ikke bruges reference counting. Istedet anses et objekt som dødt hvis det ikke kan nås fra GC-root.

Jeg forstår ikke hvad det vil sige at nedlægge objekterne selv. Man kan vel allerhøjest slippe en/alle reference(r) til dem. Men det frigives hukommelsen jo ikke af.
Avatar billede mulemule Nybegynder
04. november 2005 - 14:48 #9
"Man kan vel allerhøjest slippe en/alle reference(r) til dem. Men det frigives hukommelsen jo ikke af." <- Hvad mener du med det, som jeg forstod det skulle det vel netop frigive hukkomelsen at slippe alle referencer til objecterne ?

Tak for hjælpen indtil videre.

Der findes ikke et program hvor man kan overvåge .NET framework hvilke obj der er i ram etc ?
Avatar billede tuxic Nybegynder
04. november 2005 - 22:41 #10
hukommelsen frigives vel først når garbage collectoren kommer forbi og rydder op.

Der findes flere programmer, fx den gratis windows debugger med SOS extension. Eller Compuware's devpartner.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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