Ik heb hier een C# project waarbij een aantal grote controls zitten die een verzameling subobjecten maken, die per aanroep +-15mb geheugen in gebruik nemen.
Helaas zie ik bij het wisselen tussen de controls dat het geheugen niet vrij gemaakt word. Wat dus tot gevolg heeft dat het geheugen binnen de kortste keren vol zit en de applicatie traag gaat reageren.
Wat doe ik:
- Wanneer in het menu op een bepaalde functie gekozen word maak ik een nieuw control aan van dit type en geef een callback methode mee (voor het wisselen van het scherm)
- Ik ken de control toe aan een globale variable
- Ik voeg de control toe aan een panel
Als een nieuw control getoont moet worden:
- Ik verwijder de callback methode uit de control
- Ik ken een nieuw object toe aan de globale variable
- Ik wis alle controls van het panel
Wanneer ik AQTime Profiler erop los laat ziet deze ook dat er 0 references zijn naar het object.
Mijn vraag is dus, waarom word het geheugen niet vrij gegeven door de GC?
Hieronder nog een plaatje van AQTime die de references toont naar dit object (die er dus niet zijn):
Helaas zie ik bij het wisselen tussen de controls dat het geheugen niet vrij gemaakt word. Wat dus tot gevolg heeft dat het geheugen binnen de kortste keren vol zit en de applicatie traag gaat reageren.
Wat doe ik:
- Wanneer in het menu op een bepaalde functie gekozen word maak ik een nieuw control aan van dit type en geef een callback methode mee (voor het wisselen van het scherm)
- Ik ken de control toe aan een globale variable
- Ik voeg de control toe aan een panel
Als een nieuw control getoont moet worden:
- Ik verwijder de callback methode uit de control
- Ik ken een nieuw object toe aan de globale variable
- Ik wis alle controls van het panel
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| private void ShowActiveWindow(UserControl newWindow) { //removes current control and adds a new control if ((newWindow.GetType() == typeof (UcAuthenticate)) { if ((_activeWindow != null) && (_activeWindow != newWindow)) { _activeWindow.ReleaseResources(); } _activeWindow = newWindow; pnlBodyData.Controls.Clear(); if (_activeWindow != null) { pnlBodyData.Controls.Add(_activeWindow); } } } |
Wanneer ik AQTime Profiler erop los laat ziet deze ook dat er 0 references zijn naar het object.
Mijn vraag is dus, waarom word het geheugen niet vrij gegeven door de GC?
Hieronder nog een plaatje van AQTime die de references toont naar dit object (die er dus niet zijn):

Mess with the best, die like the rest