Avatar billede thlund Nybegynder
29. august 2005 - 09:19 Der er 6 kommentarer og
1 løsning

Collections og Memory managment

Jeg er en amatør der lige er begyndt at udforske VB.NET i dybden. I den forbindelse er jeg begyndt at bruge collections. En af mine venner, der ganske vist programmerer i VB 6.0 sagde at collections havde ret slemme memory leaks.

Jeg prøvede derfor følgende :

    Dim coll As New Collection()
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i, j As Integer

        For i = 0 To 10000
            coll.Add("ABC" & i.ToString("0"), i.ToString("0"))
        Next

        Button1.Text = "Done"

    End Sub
  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim i, j As Integer

        For i = 0 To 10000
            coll.Remove(i.ToString("0"))
        Next

        Button2.Text = "Done"
    End Sub

Altså : tryk på knap 1 og der indsættes 10.000 tekster i en collection og tryk på knap2 og de fjernes igen. Jeg kan se i Windows task manager at hukommelses forbruget stiger efter tryk på knap1, men det falder ikke ved tryk på knap2 (stiger faktisk en lille bitte smule). Hvorfor det ???

Der er selvfølgelig sådan at jeg har tænkt mig at bruge collections i en mere avanceret sammenhæng, men hvis der er memory leaks så ved jeg sku ikke.

MVH
Thomas
Avatar billede arne_v Ekspert
29. august 2005 - 09:28 #1
.NET bruger garabage collection så du kan ikke bruge VB6 erfaringer til noget
Avatar billede thlund Nybegynder
29. august 2005 - 10:23 #2
Nej, det havde jeg også på fornemmelsen.

Men hvorfor stiger hukommelses forbruget så, uden at gå ned igen ?

Thomas
Avatar billede thomashove Nybegynder
29. august 2005 - 10:44 #3
Det skyldes at .Net allokerer hukommelse i store bidder til de enkelte webprojekter  (ca 20mb til hver). Dette gøres fordi hukommelse som regel ikke er et problem på de fleste systemer og rent performance mæssigt er det bedre at allokere en stor klump som man så gør brug af - i stedet for at frigive/bruge hukommelse hele tiden...

Emnet diskuteres mange steder på nettet. f.eks. her

http://weblogs.asp.net/pwilson/archive/2004/02/14/73033.aspx
Avatar billede thlund Nybegynder
29. august 2005 - 10:53 #4
Aha - Det jeg hører dig sige er at mine elementer er lagt i GC, men den er ikke tømt endnu. Dette sker ikke før der rent faktisk er brug for det. Er det korrekt ?

Thomas
Avatar billede thomashove Nybegynder
29. august 2005 - 11:06 #5
både-og. GC's virkemåde er en smule mere kompleks. På MSDN forklarer denne artikel hvordan GC fungerer:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetgcbasics.asp

Derudover kan du se denne artikel hvikle muligheder man har for selv at nedlægge objekter (hvilket typisk ikke er nødvendigt)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconprogrammingessentialsforgarbagecollection.asp
Avatar billede thlund Nybegynder
29. august 2005 - 11:12 #6
Ok - tak.
Send lige et svar, så jeg kan kaste nogle points i din retning.

Thomas
Avatar billede thlund Nybegynder
29. august 2005 - 11:13 #7
Nååh - det havde du allerede gjort.
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