Gå til innhold

Anbefalte innlegg

Hei! Har brukt C#/.NET og da spesielt WPF en god stund nå, og har lært meg nok til at jeg klarer å lage alt jeg prøver på. Konge det, men så var det det å ha litt kontroll på ressursene også, da. Etter å ha lekt mest med C++ en stund var det dop for sjelen å få Garbage Collectoren på laget, men det å stole blindt på at den skulle kurere polio og løse det som ellers finnes av problemer var en tabbe. I en passe tung visuell app klarte jeg å nå 1,4 GB minnebruk (!), som virker som en magisk grense der .NET blir ustabilt og sier takk for seg i 32-bit apps. editbin /LARGEADDRESSAWARE, eller å rett og slett bare gå 64-bit, er jo de enkleste alternativene, men det tar bare bort symptomet. En sånn minnebruk som overhodet ikke står i forhold til det som er i sving på skjermen er et underliggende problem som må lukes ut.

 

Jeg klarte å resonnere meg frem til at et par hundre BitmapImages med rimelig høy oppløsning som lå og chillet i minnet ikke var så bra for minnebruken, og klarte å skrelle bort ~60% ved å fjerne en del der. Appen er reddet, men jeg er fremdeles ikke helt fornøyd, og dette fikk meg egentlig til å innse hvor lite jeg kan om minnehåndteringen i C#. Og da kommer vi til poenget med denne tråden: finnes det en eller flere bøker om minnehåndtering, hvordan man blir venn med GC og så videre i .NET/C#? Helst versjon 4.0. Må ikke handle utelukkende om dette, men det hadde vært greit med noe litt mer utfyllende da de bøkene jeg har lest til nå kun tar for seg minnehåndtering og tweaking av Garbage Collector i små avsnitt/seksjoner. Noen anbefalinger?

Lenke til kommentar
Videoannonse
Annonse

Har egentlig ingen anbefalinger, men det som kanskje er greit å være klar over med GC i .NET, er at du kan kun force GC å kjøre, men du kan ikke force den til å collecte noe. Med andre ord, tviler egentlig på at applikasjonen din vil ha noe spesiell gevinst av at du eksplisitt kjører GC. Tror du rett og slett må være litt flinkere til å frigi objekter du ikke bruker lenger, unhooke eventer fra instanser som ikke skal brukes lenger slik at GC kan collecte objektet, sette bildefiler til Content og ikke Resource og lese dem inn når man trenger dem osv. Rett og slett programmere "riktig". På en annen side, om det er mye minne tilgjengelig på maskinen, så bruker gjerne .NET dette, så det er ikke nødvendigvis galt at programmet bruker mye RAM.

Lenke til kommentar

Har ikke noen bokanbefalning jeg heller (MSDN er dog en fin ressurs), men har en del erfaring med garbage collectoren.

 

Det er en generational concurrent garbage collector, som vil si at den samler objekter i flere generasjoner. Generasjon null inneholder alle kortlevde objekter og vil bli frigjort dersom de ikke lenger er i bruk. Er de derimot i bruk, vil de havne en generasjon lenger ned som samles sjeldnere enn generasjon 0.

 

Den er concurrent og skal ikke påvirke ytelsen på programmet i noen stor grad når den kjører.

 

Garbage collection er bare et hjelpemiddel derimot. Det er fortsatt viktig å ha god displin på frigjøring av objekter, og at alle objekter som ikke lenger skal brukes blir derfererert.

Husk også på dispose mønsteret. Ettersom garbage collectoren kjører sjeldent, eller noen ganger aldri, så er det viktig å kalle dispose på alle objekter som bruker unmanaged ressurser, slik som bitmaps og databasekoblinger. Så bruk using på alle objekter som implementerer IDisposable.

En kan også spare mye thrashing ved å benytte struct fremfor class på objekter som enten er små, eller som ikke forlater scopet.

Endret av GeirGrusom
Lenke til kommentar
  • 3 måneder senere...
  • 1 år senere...
Gjest medlem-271921

Hei! Har brukt C#/.NET og da spesielt WPF en god stund nå, og har lært meg nok til at jeg klarer å lage alt jeg prøver på. Konge det, men så var det det å ha litt kontroll på ressursene også, da. Etter å ha lekt mest med C++ en stund var det dop for sjelen å få Garbage Collectoren på laget, men det å stole blindt på at den skulle kurere polio og løse det som ellers finnes av problemer var en tabbe. I en passe tung visuell app klarte jeg å nå 1,4 GB minnebruk (!), som virker som en magisk grense der .NET blir ustabilt og sier takk for seg i 32-bit apps. editbin /LARGEADDRESSAWARE, eller å rett og slett bare gå 64-bit, er jo de enkleste alternativene, men det tar bare bort symptomet. En sånn minnebruk som overhodet ikke står i forhold til det som er i sving på skjermen er et underliggende problem som må lukes ut.

 

Jeg klarte å resonnere meg frem til at et par hundre BitmapImages med rimelig høy oppløsning som lå og chillet i minnet ikke var så bra for minnebruken, og klarte å skrelle bort ~60% ved å fjerne en del der. Appen er reddet, men jeg er fremdeles ikke helt fornøyd, og dette fikk meg egentlig til å innse hvor lite jeg kan om minnehåndteringen i C#. Og da kommer vi til poenget med denne tråden: finnes det en eller flere bøker om minnehåndtering, hvordan man blir venn med GC og så videre i .NET/C#? Helst versjon 4.0. Må ikke handle utelukkende om dette, men det hadde vært greit med noe litt mer utfyllende da de bøkene jeg har lest til nå kun tar for seg minnehåndtering og tweaking av Garbage Collector i små avsnitt/seksjoner. Noen anbefalinger?

Kun sett dette som kapitler i bøker. Anbefaler deg e bøker via abonnement fra safari oreilly

 

http://my.safaribooksonline.com/home.

 

Kjøpe et billig abonnement der, og søk etter temmet i tusenvis av bøker. Har gjort dette selv i mange år, og er bedre enn å kaste penger ut av vinduet på dyrebøker. Bøker kan lovlig lastes ned og skrives ut hvis enkelte kapitler faller i smak. Kjøper du det dyreste abonnementet får du også videoer.

 

Er ikke aktiv på dette nettstedet, men kom over ditt spørsmål, og valgte å svare siden dette antakelig er noe mange andre lurer på. Lykke til.

 

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...