/ / Windows 7 x64 che esegue un'app x86 .NET genererà memoria insufficiente a meno che non esegua GC.Collect - .net, windows-7, perdite di memoria, garbage-collection

Windows 7 x64 che esegue un'app x86 .NET genererà memoria insufficiente a meno che non esegua GC.Collect - .net, windows-7, perdite di memoria, garbage-collection

Ho trovato la soluzione, ma il comportamento è abbastanza preoccupante e ho pensato di chiederlo qui se anche altri lo vedessero.

Fondamentalmente, lo stesso binario che è stato aggiunto per essere costruito in x86 (spiegherà perché di seguito) in esecuzione in x64 Windows 7 verrà perso a meno che non forzare un GC.Collect ()

Spiegare:

  1. L'applicazione fa un sacco di rendering bitmap (> 60 per / sec)
  2. Esiste una DLL esterna in C ++ (C ++ gestito)
  3. Ci sono due thread (worker e ui)
  4. C'è un aggiornamento dell'interfaccia utente (statistiche)
  5. Questo comportamento si verifica solo su questa macchina, Windows 7 x86 funziona perfettamente.

L'applicazione aumenterà fino a superare 1,5 G e alla fine genererà un'eccezione di memoria insufficiente. Più veloce (1) funziona, più veloce è l'eccezione.

Per quelli pronti a sparare (2) per causare la perdita, ho provato a rimuoverlo e la perdita è rimasta più la memoria viene rilasciata correttamente se faccio GC.Collect (), che nei miei libri è un problema .NET.

Grazie.

risposte:

0 per risposta № 1

OK, per quello che vale, ecco la mia cattura.

ho visto esattamente lo stesso problema che stai vivendo. Era di nuovo in .NET 2.0, ma stavo lavorando con grandi immagini e anche se Disporrei le immagini, il consumo di memoria aumenterebbe, finché non avrò chiamato manualmente GC.Collect().

Cos'altro era simile? Ospitando! La mia applicazione era un EXE non gestito e che avrebbe usato COM per creare un oggetto a cui è stata esposta una classe .NET COM. Ciò causerebbe l'EXE non gestito per ospitare il CLR.

Su Windows X64, verranno caricate le app X32 WOW (Windows su Windows) modalità che è un hosting simile che credo possa esibire problemi simili. Sembra GC non è in grado di comprendere appieno il consumo di memoria quando si trova in un ambiente ospitato.


0 per risposta № 2

Stai smaltendo correttamente i tuoi bitmap e tutte le altre risorse usa e getta inclusi gli oggetti GDI +?

using(Bitmap bitmap = ...)
{
... do your stuff
}

Devi cercare la tua applicazione per trovare ilproblema: chiaramente 1,5 GB è eccessivo per un'applicazione a 32 bit. Il fatto che tu stia ottenendo un comportamento diverso su macchine diverse con SO diverso non significa che dovresti dare la colpa al sistema operativo.


0 per risposta № 3

Potresti provare a non fare affidamento sul garbage collector. Se si riscrive il codice di estrazione per ripulire le risorse inutilizzate, probabilmente non si eseguirà lo scenario descritto.

Image.Dispose ()

Nota chiama sempre Dispose prima di te rilascia il tuoultimo riferimento al Immagine. Altrimenti, le risorse lo sono usando non sarà liberato fino al Garbage Collector chiama l'immagine oggetto "s Metodo di finalizzazione.


0 per risposta № 4

Devi .Dispose () dei tuoi bitmap quando smetti di usarli. Il GC alla fine raccoglierà questa memoria (quando esegue il finalizzatore) anche se non si chiama esplicitamente .Dispose () - ma il GC non è una cura magica per sovra-allocare memoria, se lo si fa più velocemente allora il GC può raccoglierli, usando le risorse che il GC non può controllare direttamente (le risorse non gestite sono esattamente questo) - quindi il meccanismo GC non può aiutarti.

Chiamando GC.Raccogli (0) costringi il GC a elaborare l'albero degli oggetti e chiama tutti i finalizzatori, se non lo chiami, il GC viene eseguito quando crede che sia l'ora e quindi è troppo tardi (a causa di l'alto tasso di allocazione).