Avatar billede clinton-2 Nybegynder
23. oktober 2008 - 10:29 Der er 13 kommentarer

Voksende memory forbrug.

C# .NET3.5 og WPF

Kigger jeg i taskmanageren stiger hukommelses forbruget med ca. 1GB om dagen, minimere jeg vinduet falder programmets forbrug til ca. 20MB. har prøvet at force Garbage Collectoren, men den rydder ikke noget særligt op, nogen ideer?

\Lars
Avatar billede clinton-2 Nybegynder
23. oktober 2008 - 11:01 #1
Skyldneren findes her, men hvorfor?
        private void addLogText(string text)
        {
            if (TextBoxLog.Dispatcher.CheckAccess())
            {
                TextBoxLog.Text = text +"\r\n" + TextBoxLog.Text;
                while (100 < TextBoxLog.Text.Split('\n').Length) //remove lines
                {
                    int i = TextBoxLog.Text.LastIndexOf('\n');
                    TextBoxLog.Text = TextBoxLog.Text.Remove(TextBoxLog.Text.LastIndexOf('\n') - 1);
                }
            }
            else
            {
                TextBoxLog.Dispatcher.BeginInvoke(DispatcherPriority.Render, new VoidDelegate(delegate { addTextBox(text); }));
        }
Avatar billede sherlock Nybegynder
23. oktober 2008 - 11:44 #2
Hvis du skal tvinge en oprydning i GC, skal du udføre

      GC.Collect();
      GC.WaitForPendingFinalizers();

2 gange.

Ved første kald vil den kun markere kandidater til udsmidning. I 2. kald vil den reelt rydde op.
Avatar billede clinton-2 Nybegynder
23. oktober 2008 - 11:56 #3
sherlock: Det gør desværre ingen forskel.
Avatar billede driis Nybegynder
23. oktober 2008 - 18:04 #4
Hvordan har du konstateret at skyldneren skal findes i det stykke kode du har postet ? Der er som udgangspunkt ikke noget "farligt" i det.
Avatar billede arne_v Ekspert
23. oktober 2008 - 22:31 #5
Der tjener ikke noget formål at kalde GC eksplicit.
Avatar billede arne_v Ekspert
23. oktober 2008 - 22:33 #6
Den pågældende kode genererer en hel del objekter.
Avatar billede arne_v Ekspert
23. oktober 2008 - 22:34 #7
Men du skal nok starte med at forklare hvad problemet er !

At det irriterer dig at .NET bruger memory som eller vil være ubrugt tæller ikke.
Avatar billede clinton-2 Nybegynder
24. oktober 2008 - 10:45 #8
Skyldneren er konstateret ved at udkommentere program dele, indtil der var styr på hukommelses forbruget. Problemet opstår først efter en dags tid, hvor windows er nødt til at swappe unødig meget på disken.

Tanken med koden var at lave en textbox, hvor der kunne logges hændelser. Findes der en smartere måde at gøre det på?

\Lars
Avatar billede driis Nybegynder
24. oktober 2008 - 17:53 #9
Det er en ret ineffektiv måde at gøre det på med loggen, fordi du opererer på en stor streng igen og igen. Og du vil få allokeret en del lange strenge. Men i det stykke kode du har postet er der intet der tyder på at du holder fast på referencer til strengene, så umiddelbart vil de blive garbage collected automatisk.
Avatar billede sherlock Nybegynder
24. oktober 2008 - 21:29 #10
Nu kender jeg jo ikke din applikation, men det rigtige sted at lave en log i Windows, er Eventloggen. Hvis den kan bruges i dit tilfælde, kan du læse om den her:

http://www.123aspx.com/redir.aspx?res=27953
Avatar billede arne_v Ekspert
25. oktober 2008 - 01:43 #11
Windows event log er god til nogle former for log - men hvis man logger meget så skal
man bruge separate flat files og rotate dem.
Avatar billede clinton-2 Nybegynder
11. november 2008 - 08:09 #12
Var mest tiltænkt udviklingsfasen, bruger ellers flade filer. Smid et svar så delr jeg point'ne ud, ser ikke ud til at komme mere response på tråden.
Avatar billede sherlock Nybegynder
11. november 2008 - 10:00 #13
Ahh. Til udvikling !!
Der kan du bruge http://logging.apache.org/log4net/release/framework-support.html
Der er sikkert også flere.
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

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