Archief - VB.NET geheugengebruik programma

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

breez

Legacy Member
Ik heb een programma met een timer die om de 1500ms iets uitvoert, namelijk:
de lijst met draaiende processen overlopen en zoeken ofdat er een bepaald proces in staat

het probleem is dat dit in het begin goed loopt (je ziet wel dat het geheugengebruik telkens groter wordt, en dan komt de garbage collector om de boel op te kuisen)

maar na enkele uren is het geheugengebruik uiteindelijk dan toch gestegen van pakweg 25mb naar meer dan 80mb... niet echt gewenst dus

Ik had een stukje code gevonden om de garbage collector te forceren, maar soms neemt het programma uiteindelijk toch nog veel geheugen in:
Code:
System.GC.Collect()
System.GC.WaitForPendingFinalizers()
System.GC.Collect()
hoe kan ik het geheugengebruik kleiner maken?

Albireo

Legacy Member
Het eerst waar ik aan denk zijn objecten die je zou moeten disposen maar vergeten bent om te disposen.

Post je code eens, dan zien we wat meer.

breez

Legacy Member
Code:
    Private Sub tmrProcessScanner_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrProcessScanner.Tick
        Try
            For Each oProcess As Process In Process.GetProcesses
                If oProcess.ProcessName = "WolfMP" Then
                    'RTCW IS RUNNING
                    Dim fullpath As String = oProcess.MainModule.FileName
                    Dim trimmedpath As String = fullpath.Remove(fullpath.LastIndexOf("\"), 11)

                    If Not RTCWPath = trimmedpath Then
                        RTCWPath = trimmedpath
                        fswMaps.Path = RTCWPath & "\Main"
                        fswMaps.EnableRaisingEvents = True

                        'Cleanup TMP files
                        CheckTMPFiles()

                        'Memory cleanup
                        fullpath = Nothing
                        trimmedpath = Nothing

                        Exit Sub
                    End If

                    'Memory cleanup
                    fullpath = Nothing
                    trimmedpath = Nothing

                    'Exit for lus
                    Exit For
                Else
                    'RTCW IS NOT RUNNING
                    If Not RTCWPath = "" Then
                        RTCWPath = ""
                        fswMaps.EnableRaisingEvents = False
                    End If
                End If
            Next
        Catch ex As Exception

        End Try
    End Sub

fswMaps is een filesystemwatcher
rtcwpath is een string modulevariabele

checktmpfiles:
Code:
    Private Sub CheckTMPFiles()
        Try
            'TMP Files cleanup
            If Directory.Exists(RTCWPath & "\Main") Then
                For Each oFile As String In Directory.GetFiles(RTCWPath & "\Main")
                    If oFile.EndsWith(".pk3.tmp") Then
                        File.Delete(oFile)
                    End If
                Next
            End If
        Catch ex As Exception

        End Try
    End Sub

Duke_Puke

Legacy Member
En als je die twee string variabelen (fullpath en trimmedpath) nu op classniveau declareert en pas in uw try/catch blok instantieert? Worden de geheugenlocaties dan niet steeds opnieuw gebruikt ipv telkens een nieuwe bij iedere tick?

En als ge uw Directory.GetFiles list in een variabele stopt in een "using" block? Dan worden die ook al disposed als ge uit uwen using block gaat...

Zijn enkel paar opmerkingen, kan niet garanderen dat het heel veel zal helpen hoor :)

breez

Legacy Member
Duke_Puke zei:
En als je die twee string variabelen (fullpath en trimmedpath) nu op classniveau declareert en pas in uw try/catch blok instantieert? Worden de geheugenlocaties dan niet steeds opnieuw gebruikt ipv telkens een nieuwe bij iedere tick?

En als ge uw Directory.GetFiles list in een variabele stopt in een "using" block? Dan worden die ook al disposed als ge uit uwen using block gaat...

Zijn enkel paar opmerkingen, kan niet garanderen dat het heel veel zal helpen hoor :)
kan idd eens dat eerste proberen

die using statement kende ik nog niet maar ziet er wel nuttig uit,
zal het ook eens uittesten.

thx

breez

Legacy Member
ik dispose nu die Process variabele telkens na gebruik en heb de 2 string variabelen globaal gezet en het probleem lijkt verdwenen te zijn
geheugen gebruik blijft nu constant :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan