2009-10-04 2 views
6

Esiste un set noto (documentato) di tipi .NET che alloca memoria nella parte non gestita della memoria del processo?Quali classi gestite in .NET Framework allocano (o utilizzano) memoria non gestita?

Ad esempio, Microsoft documenta che l'infrastruttura WPF ha allocato la memoria non gestita per il modello di rendering conservato al fine di ottimizzare le prestazioni. Esistono altre porzioni del framework .NET che utilizzano grandi quantità di memoria non gestita?

risposta

5

Se implementa IDisposable, è molto probabile che possieda dati non gestiti o che sia proprietario di una classe gestita che alla fine possiede dati non gestiti. Se ha Finalize(), è segno che possiede direttamente i dati non gestiti.

Come regola generale, se implementa IDisposable, quindi Dispose() non appena hai finito.

+1

Corretto a "IDisposable". Inoltre, la regola più affidabile è se implementa un finalizzatore, quasi certamente possiede dati non gestiti. – bobbymcr

+1

Infatti - la maggior parte degli elementi 'IDisposable' * non * (direttamente) fa qualcosa di non gestito - ma concatenano a qualcosa che * potrebbe *. Ad esempio, esiste un 'IDisposable' in blocchi iteratori - ma nulla non gestito. –

1

Per quanto ne so, non esiste un singolo documento che descriva o identifichi quali classi nel framework utilizzano risorse non gestite. La documentazione MSDN per la classe specifica potrebbe, ma ciò richiederebbe l'esame di classi specifiche.

Nel complesso, è una scommessa sicura che molte delle classi fanno uso di un codice non gestito a un certo punto. Ad esempio, molti dei controlli Windows Form sono semplicemente wrapper attorno ai controlli Win32 in modo da utilizzare risorse non gestite.

0

È necessario fare attenzione quando una classe implementa IDisposable. Questo di solito indica l'utilizzo di risorse non modificate, che tuttavia non sono limitate alla memoria ma potrebbero anche essere filehandle, socket ecc.

Un buon indicatore per questo è quando la classe utilizza uno IntPtr.