Avatar billede staever Nybegynder
24. juli 2007 - 17:45 Der 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?
Avatar billede arne_v Ekspert
24. juli 2007 - 17:48 #1
Taler du om memory .NET runtime har allokeret fra Windows eller om memory som
din app har allokeret fra .NET runtime ?
Avatar billede staever Nybegynder
25. juli 2007 - 06:18 #2
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?
Avatar billede arne_v Ekspert
26. juli 2007 - 03:03 #3
Prøv lige og kør de 2 følgende eksempler !
Avatar billede arne_v Ekspert
26. juli 2007 - 03:03 #4
using System;
using System.Diagnostics;

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();
        }
    }
}
Avatar billede arne_v Ekspert
26. juli 2007 - 03:04 #5
using System;
using System.Diagnostics;

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();
        }
    }
}
Avatar billede staever Nybegynder
26. juli 2007 - 10:38 #6
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 :)
Avatar billede staever Nybegynder
31. juli 2007 - 08:55 #7
kan se det burde virke, dog frigiver den ikke al den hukommelse som .NET har allokeret fra Windows.

Smid et svar.
Avatar billede arne_v Ekspert
31. juli 2007 - 15:14 #8
Svar.

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
Avatar billede staever Nybegynder
31. juli 2007 - 15:39 #9
jeg takker ihvertfald for hjælpen :)
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