24. juli 2007 - 17:45Der er
8 kommentarer og 1 løsning
AppDomain.Unload frigører umildbart ikke nogen hukommelse
Når jeg har oprettet et AppDomain i mit program og fået det hele til at køre, vil jeg gerne at jeg kunne unloade det runtime igen. Her kommer mit spørgsmål så, skal man ikke kunne se på RAM forbruget af programmet at man har kørt AppDomain.Unload eller går der noget tid inden det sker, tænker her på om der er en Garbage Collector el.lign der lige skal køres først?
Det er den hukommelses mængde som man kan se under fanebladet "Processer" i TaskManageren. Inden jeg loader mit AppDomain bruger programmet ca. 6MB, men når jeg loader det ind stiger forbruget til ca. 17 MB, men det falder tilsyneladende ikke igen når jeg kører en Unload.
Er ikke helt sikker på om det er det du spørger om, ved ikke lige hvor jeg ser hvor meget .NET har allokeret?
namespace E { public class MainClass { public static void PrintMemoryStatus() { Console.WriteLine("Application has allocated from .NET " + GC.GetTotalMemory(false)/1000000 + " MB"); Console.WriteLine(".NET has allocated from Windows " + Process.GetCurrentProcess().PrivateMemorySize/1000000 + " MB"); } public static void Main(string[] args) { Console.WriteLine("Startup"); PrintMemoryStatus(); Console.WriteLine("Allocate 50 MB"); byte[] b = new byte[50000000]; PrintMemoryStatus(); Console.WriteLine("50 MB ready for GC"); b = null; PrintMemoryStatus(); Console.WriteLine("Do GC"); GC.Collect(); PrintMemoryStatus(); Console.ReadLine(); } } }
namespace E { public class Foobar : MarshalByRefObject { private byte[] b; public Foobar() { b = new byte[50000000]; } public byte[] B { get { return b; } } } public class MainClass { public static void PrintMemoryStatus() { Console.WriteLine("Application has allocated from .NET " + GC.GetTotalMemory(false)/1000000 + " MB"); Console.WriteLine(".NET has allocated from Windows " + Process.GetCurrentProcess().PrivateMemorySize/1000000 + " MB"); } public static void Main(string[] args) { Console.WriteLine("Startup"); PrintMemoryStatus(); Console.WriteLine("Create app domain with 50 MB object"); AppDomain d = AppDomain.CreateDomain("arne"); object o = d.CreateInstanceAndUnwrap("EE11", "E.Foobar"); PrintMemoryStatus(); Console.WriteLine("Unload app domain"); AppDomain.Unload(d); PrintMemoryStatus(); Console.WriteLine("Do GC"); GC.Collect(); PrintMemoryStatus(); Console.ReadLine(); } } }
Takker for eksemplet Arne. Kan se at det er når GC.Collect() bliver kørt at den frigiver de sidste MB hukommelse. Det gav mig også lige en bedre indsigt i hvad det var for hukommelse både .NET allokere og programmet allokere fra .NET. Så mangler jeg bare at få mit eget til at virke ligeledes :)
Det kan der vaere 2 grunde til: - .NET regner med at du vil allokere noget igen saa den beholder det til senere brug - de brugte og ubrugte memory klumper ligger paa saasan en maade at de ubrugte ikke kan deallokeres
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.