Jag har upptäckt att min app tar till sig mer och mer minne för varje gång jag uppdaterar mitt dataset mot databasen. Varje gång du släpper ett objekt och skapar ett nytt så kommer du att få lite mer minnesanvänding. Det låter som Microsoft har kopierat den modell som Linux-kärnan använder sig av. När en struktur frigörs, hamnar den i en "cache". Om en ny struktur önskas, plockas den i första hand från denna cache. Behöver minne frigöras, frigörs i första hand strukturer från cachen. MS har inte kopierat en Linux modell, Precis, MS implementation använder saker som generationer för prestanda förbättringar samt en egen algoritm som avgör när minneshantering skall genomföras. Det är i denna algoritmen som "hemligeten" ligger hos de olika implementationerna.Minnesläcka vid fill
Om jag håller ett öga på allokerat minne i Aktivitetshanteraren så ser jag att den käkar 2 Mb för varje uppdatering.
Koden ser ut såhär:
DS.tables("bild").clear
DataAdapterBild.fill(DS.tables("bild"))
Ser inte ut att vara några konstigheter.
(en bifråga: hur gör man så att koden i inlägger ser ut som i Visual Studio? med färger)
Känns problemet igen?Sv: Minnesläcka vid fill
Det beror på minnesmodellen, Garage Collectorn, som .NET använder sig av. I korta drag så innebär den att även om du släppt referenserna till ditt minne så kommer inte minnet att sluta användas utan det görs först vid något som kallas en Collect.
Collect kan ske någon gång emellan att du släppt referensen till att applikationen stänger ner.
Det är det som uppfattas som en minnesläcka vanligtvis. Det är dock inget att oroa sig för, om operativet behöver minnet så kommer .NET att köra en Collect för att minnet skall lämnas tillbaka.
du använder code taggen för att färga kod. Sv: Minnesläcka vid fill
Sv: Minnesläcka vid fill
däremot bygger den på samma <b>Akademiska</b> modell som linux använder sig av, dvs Collect. Modellen har funnits teoretiskt långt innan Linux såg sitt första ljus.Sv: Minnesläcka vid fill