Ik heb een programmaatje gemaakt waar in binnen een functie een ArrayList maak. Deze ArrayList krijgt een forse grote van 1.048.576 records met een geheugen gebruik van ongeveer 90mb. Nu zou je verwachten dat als je uit de functie gaat, dat de objecten die daar gedeclareerd waren vrij worden gegeven. Schijnbaar is dit niet het geval. Ook als ik aan het einde van de functie de methode Clear aanroep wordt het geheugen niet vrij gegeven. Weet iemand een manier om dit geheugen vrij te geven of heb ik hier te maken met een memoryleak?
Zonder code is het erg moeilijk uitspraken doen over of je misschien iets verkeerd declareert (of denkt vrij te geven). Verder is het de vraag hoe jij de memory-usage meet: de taskmanager is daarvoor in ieder geval GEEN goede tool.
Het zou ook kunnen zijn dat de garbage collector het geheugen nog niet teruggeclaimed heeft. Je kunt dit eventueel zelf forceren, gebruik makend van System.GC.
Het zou ook kunnen zijn dat de garbage collector het geheugen nog niet teruggeclaimed heeft. Je kunt dit eventueel zelf forceren, gebruik makend van System.GC.
edit:
TaskManager geeft 't verwachtte geheugengebruik weer. Minimaliseer je applicatie maar eens en zie wat er met het geheugengebruik in TM gebeurt!
TaskManager geeft 't verwachtte geheugengebruik weer. Minimaliseer je applicatie maar eens en zie wat er met het geheugengebruik in TM gebeurt!
[ Voor 19% gewijzigd door OZ-Gump op 02-02-2005 10:41 ]
ik denk niet dat dit een memory leak is.
nu weet ik zo van C# niet de commando's maar .clear lijkt me niet de juiste methode om een array uit je geheugen te halen.
lijkt me meer om al je records 'leeg' te maken.
nu weet ik zo van C# niet de commando's maar .clear lijkt me niet de juiste methode om een array uit je geheugen te halen.
lijkt me meer om al je records 'leeg' te maken.
This message was sent on 100% recyclable electrons.
Als je een standaard .NET-applicatie maakt dan is het geheugen garbage collected, dus als het geheugen niet wordt vrijgegeven dan zal er nog ergens een reference naar die instance zijn die zorgt dat hij niet gecollect wordt. Clear aanroepen staat opzich los van deallocatie.
C# (lees DOTNET) heeft een Garbage collector die na een interval wordt uitgevoerd. De GC zal alleen objecten opruimen waar niet meer naar verwezen wordt. Zorg dus iig dat er geen objecten refereren naar je ArrayList. Als je een expliciete destruction wilt zal je met Dispose moeten gaan werken.
Ben zelf nog net begonnen met C# dus ik kan je niet echt verder helpen. Marruh 1.048.576 records in een arraylist opslaan lijkt mij niet erg slim. Waarom zou je zoveel records in je geheugen willen cachen?
Ben zelf nog net begonnen met C# dus ik kan je niet echt verder helpen. Marruh 1.048.576 records in een arraylist opslaan lijkt mij niet erg slim. Waarom zou je zoveel records in je geheugen willen cachen?
It’s nice to be important but it’s more important to be nice
Klopt voor veel objecten, maar ArrayList heeft geen Dispose functie. Het leegmaken van de ArrayList met Clear is voldoende (maar zelfs in principe niet nodig). Als de ArrayList daarna buiten scope raakt, zal de GC het ding automatisch opruimen, eventueel na een kleine vertraging. Zoals eerder gezegd kun je dat opruimen ook forceren.Als je een expliciete destruction wilt zal je met Dispose moeten gaan werken.
[ Voor 5% gewijzigd door OZ-Gump op 02-02-2005 10:44 ]
Ok, van zo'n Garbage collector had ik dus nog nooit gehoord. Ik zal er eens induiken om daar inzicht in te krijgen. Verder heb ik die Arraylist nodig (denk ik dan) om een invoer file in te lezen. Ik weet alleen niet in welke vorm het instaat. Door het in een ArrayList te zetten kan ik dmv code stappen naar voren en terug doen bij het ontcijferen ervan.
Je weet alleen niet wanneer de GC 'inkicked'.OZ-Gump schreef op woensdag 02 februari 2005 @ 10:44:
[...]
Klopt voor veel objecten, maar ArrayList heeft geen Dispose functie. Het leegmaken van de ArrayList met Clear is voldoende (maar zelfs in principe niet nodig). Als de ArrayList daarna buiten scope raakt, zal de GC het ding automatisch opruimen, eventueel na een kleine vertraging. Zoals eerder gezegd kun je dat opruimen ook forceren.
Het forceren van de GC (met GC.Collect) is meestal niet aan te raden, omdat het de performance negatief kan beinvloeden. In extreme gevallen kan het natuurlijk wel een hulp bieden.
Echter, ik vraag me af waarom je in hemelsnaam 1 miljoen records in het geheugen wilt laden ?
https://fgheysels.github.io/
Da's inderdaad waar. Zoiets is namelijk erg afhankelijk van wat er verder op je systeem gebeurt. Uit de help van VS.Net 2003:Je weet alleen niet wanneer de GC 'inkicked'.
Er wordt aangegeven dat er een mogelijkheid is om het zelf te doen met Collect(), maar daar wordt inderdaad ook over gezegd dat het nadelig kan werken op je performance.Garbage collection happens automatically when a request for memory cannot be satisfied using available free memory.
Vraag blijft overigens: hoe bepaal je de hoeveelheid gebruikt geheugen? Als je wilt weten hoeveel geheugen je applicatie nu vasthoudt (volgens de GC) kun je System.GC.GetTotalMemory() gebruiken. Die geeft een realistischer beeld dan de taskmanager.
[ Voor 10% gewijzigd door OZ-Gump op 02-02-2005 11:00 ]
Pagina: 1