/ / Windows 7 x64 beží x86. NET aplikácia bude hádzať mimo pamäte, ak nemám GC.Collect -. Net, windows-7, úniku pamäte, zber odpadu

Windows 7 x64 s aplikáciou x86 .NET vyhodí z pamäti, ak nemám GC.Collect - .net, windows-7, úniky pamäte, zber odpadu

Našiel som riešenie, ale správanie je celkom znepokojujúce a myslel som, že sa tu pýtam, či to niekto iný videl.

V podstate rovnaké binárne, ktoré bolo pripravené na zabudovanie do x86 (vysvetlíme, prečo nižšie) beží v systéme x64 Systém Windows 7 bude vytekať, ak nevynútim funkciu GC.Collect ()

Vysvetliť:

  1. Aplikácia robí veľa bitmapového vykresľovania (> 60 per / sec)
  2. Existuje externý C ++ dll (spravovaný C ++)
  3. Existujú dve vlákna (pracovník a ui)
  4. Tam je UI osviežujúci (štatistiky)
  5. Toto správanie sa deje iba v tomto zariadení, Windows 7 x86 to beží v poriadku.

Aplikácia vyrastie na viac ako 1,5G a nakoniec vyhodí výnimku mimo pamäte. Čím rýchlejšie (1) funguje, tým rýchlejšia je výnimka.

Pre tých, ktorí sú pripravení strieľať (2) kvôli úniku, skúšal som ich odstrániť a únik zostal plus pamäť sa uvoľní dobre, ak urobím GC.Collect (), čo je v mojej knihe .NET problém.

Ďakujem.

odpovede:

0 pre odpoveď č. 1

OK, za to, čo stojí za to, tu je môj úlovok.

videl som presne ten istý problém, ktorý prežívate, Bolo to späť v .NET 2.0, ale pracoval som s veľkými obrázkami a hoci Tieto obrázky by som zlikvidoval, spotreba pamäte by vzrástla - kým nepovolám manuálne GC.Collect().

Čo iné bolo podobné? Hosting! Moja žiadosť bola nespravovaná EXE a to by používalo COM vytvoriť objekt, na ktorý bola vystavená trieda .NET COM, To by spôsobilo, že nespravovaná EXE bude hostiť CLR.

V systéme Windows X64 sa načítajú aplikácie X32 WOW (okná na oknách) režim, ktorý je podobný hosting, ktorý som presvedčený, že môže vykazujú podobné problémy, Zdá sa GC nemôže plne pochopiť spotrebu pamäte, keď je v hostiteľskom prostredí.


0 pre odpoveď č. 2

Správne likvidujete bitmapy - a všetky ostatné disponibilné zdroje vrátane objektov GDI +?

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

Musíte sa pozrieť na vašu žiadosť o nájdenieproblém - jednoznačne je 1,5 GB pre 32-bitovú aplikáciu. Skutočnosť, že máte rôzne správanie na rôznych počítačoch s rôznymi operačnými systémami, neznamená, že by ste mali obviňovať systém OS.


0 pre odpoveď č. 3

Mohli by ste sa snažiť nespoliehajte sa na zberač odpadkov toľko. Ak prepisujete kód kreslenia, aby ste vyčistili nevyužité zdroje, pravdepodobne nebudete môcť prejsť do popísaného scenára.

Image.Dispose ()

Poznámka Vždy volajte Pred likvidáciou uvoľnite svojeposledný odkaz na Image. Inak to sú zdroje použitie sa nebude uvoľňovať až do zberač odpadu zavolá obrázok metóda finalizácie objektu.


0 pre odpoveď č. 4

Musíš .Zrušte () vaše bitmapy, keď ich prestanete používať. GC bude nakoniec zhromažďovať túto pamäť (pri spustení finalizátora) aj vtedy, keď explicitne nevyvoláte. Dispose () - ale GC nie je čarovná liečba pre nadmerné rozdelenie pamäte, ak to robíte rýchlejšie, potom GC zhromažďovať ich pomocou zdrojov GC prevýšenia kontroly priamo (nekontrolované zdroje sú presne to) - potom mechanizmus GC vám nemôže pomôcť.

Zavolaním na GC.Zozbierajte (0), že nútite GC spracovávať strom objektov a zavolať všetky finalizátory, ak ich nepozvete, potom GC beží, keď si myslí, že je to čas, a potom je príliš neskoro (kvôli vysoká miera prideľovania).