Liberare le risorse

mercoledì 12 maggio 2004 - 11.24

pecos81 Profilo | Junior Member

Ciao a tutti,
sto letteralmente STRIPPANDO!
Nel mio programma ho una FrmMain che è MDIContainer e le altre form sono MDIChildren.
Queste ultime le apro così:
Dim form As New FrmAziende
form.MdiParent = Me
form.Show()
Ora: quando eseguo il programma (da ambiente di sviluppo) il task manager di windows mi dice che il relativo processo occupa quasi 27MB di memoria. Se apro il mio FrmAziende vola a 34MB, ma quando chiudo la form con i comandi
MyBase.Dispose()
MyBase.Close()
l'allocazione di memoria non scende.
Preciso che quando esegue l'autogenerato

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

NON trova components, quindi non fa alcuna dispose!!
In allegato vi spedisco quello che ho trovato su MSDN, ma nn ho capito bene come implementare la classe.
Ho trovato riferimenti alla GarbageCollection, ma non so bene come implementarla.
qualcuno sa aiutarmi?

alextyx Profilo | Expert

Caro Pecos, te la do con ampio beneficio di inventario....mi risulta che le risorse che tu liberi vengano inglobate nella Garbage Collection, che, ALLA BISOGNA, le smobilita in maniera definitiva rendendole effettivamente disponibli. In parole povere, le risorse che tu presumi di liberare, in realtà vengono solo identificate come riutilizzabili, ma non è detto che ciò avvenga subito. Forse è x questo che non noti la differenza. Ripeto che sto andando a lume di naso, la mia è più una sensazione che altro. Lascio ad amici + esperti il cassare o l'avallarre quanto ti ho , incertamente, suggerito! :-)

Brainkiller Profilo | Guru

E' proprio come dice Alex. Il Garbage Collector è un meccanismo abbastanza complicato. Gli oggetti in memoria vengono organizzati in "generations" questo è il termine a tre livelli 0, 1 e 2. A ogni collection (processo con cui vengono raggruppati gli oggetti, ripulita della memoria ecc.) gli oggetti vengono shiftati di un livello. Ora non so spiegarti per filo e per segno perchè dovrei andare a rinfrescarmi la memoria. Comunque generalmente la garbage collection scatta solo in alcuni momenti ed è gesitta dal Framework. In quel momento se c'è memoria marcata come "non utilizzata" può essere ripulita.
Se vuoi fare un test puoi forzare il garbage collector digitando questa riga di codice:

GC.Collect()

Prova a vedere se poi cala effettivamente l'uso del processo.

ciao
david

pecos81 Profilo | Junior Member

ho identificato un pò meglio cos'è che mi prende tanta memoria: il dataset.
Nel form dichiaro
Private DS As New DataSet
Private DA_Aziende As New OleDb.OleDbDataAdapter
Private DV_Aziende As DataView
e, nel form load eseguo
DA_Aziende.SelectCommand = New OleDb.OleDbCommand("select * from Aziende", DBS)
DA_Aziende.Fill(DS, "Aziende")
DV_Aziende = New DataView(DS.Tables("Aziende"))
la tabella aziende è immensa ed è nel nel fill del ds che la memoria allocata incrementa.
Nella close del form, però, nonostante faccia
DS.Clear()
DS.Dispose()
GC.Collect()
Me.Dispose()
la memoria allocata non cala. è qui che mi blocco e non so se è così che deve essere o posso fare qualcosa

Brainkiller Profilo | Guru

Si è così ed è corretto.
Se non sbaglio il Framework non riduce comunque la dimensione del processo perchè l'area allocata potrebbe essere riutilizzata, quindi effettivamente la memoria viene pulita ma resta in carico al processo. Probabilmente se tu tieni attivo il programma per qualche minuto dovrebbe ridursi come dimensione.

Ti consiglio perchè capita a tutti, il DataSet è una struttura in memoria quindi se tu fai query grosse ti spari tutti i risultati nella RAM e ti gonfia la memoria occupata. Quindi nella Select usa solo i campi di cui hai bisogno invece di usare *

ciao
david

pecos81 Profilo | Junior Member

Va beh, l'importante è che il mio codice sia quanto più corretto possibile. Grazie comunque per l'aiuto
Ciao

Arlene Profilo | Junior Member

non so se ti dico una stupidaggine ma penso che il colose e il dispose non liberi subito la memoria ma il dataset rimane caricato prova a assegnare il valore nothing al dataset cosi viene sfuotato subito

Brainkiller Profilo | Guru

Per svuotare il DataSet si può usare il metodo Clear().
Se non si vuole più usare il DataSet si chiama il metodo Dispose().
In questo modo si indica al Garbage Collector che non vogliamo più utilizzare il DataSet e alla prossima Garbage Collection verrà pulito ed eliminato dalla memoria.

ciao
david
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5