Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Liberare le risorse
mercoledì 12 maggio 2004 - 11.24
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
pecos81
Profilo
| Junior Member
68
messaggi | Data Invio:
mer 12 mag 2004 - 11:24
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
668
messaggi | Data Invio:
mer 12 mag 2004 - 19:41
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
7.999
messaggi | Data Invio:
mer 12 mag 2004 - 22:06
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
68
messaggi | Data Invio:
gio 13 mag 2004 - 18:53
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
7.999
messaggi | Data Invio:
gio 13 mag 2004 - 22:18
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
68
messaggi | Data Invio:
gio 13 mag 2004 - 22:43
Va beh, l'importante è che il mio codice sia quanto più corretto possibile. Grazie comunque per l'aiuto
Ciao
Arlene
Profilo
| Junior Member
75
messaggi | Data Invio:
mer 9 giu 2004 - 16:19
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
7.999
messaggi | Data Invio:
lun 14 giu 2004 - 14:21
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
Torna su
Stanze Forum
Elenco Threads
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 !