Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 huseyint
huseyint

Anatomia unui "Scurgere de Memorie"

În .NET perspectivă:

  • Ce este un scurgeri de memorie?
  • Cum poți determina dacă aplicația dvs. scurgeri? Care sunt efectele?
  • Cum se poate preveni o scurgere de memorie?
  • Dacă aplicația are scurgeri de memorie, nu se merge departe atunci când procesul de ieșiri sau este ucis? Sau pierderi de memorie în aplicația dumneavoastră afectează alte procese de pe sistem, chiar și după finalizarea procesului?
  • Și ce despre unmanaged code accesate prin intermediul COM Interop și/sau P/Invoke?
170 2008-08-01T15:12:34+00:00 15
Programare
.net
performance
memory-leaks
com-interop
Comentarii la întrebare (0)
Soluția
Karl Seguin
Karl Seguin
1 august 2008 в 3:28
2008-08-01T15:28:12+00:00
Mai mult
Sursă
Editează
#8406359

Cea mai bună explicație pe care am'am văzut în Capitolul 7 de liber Bazele de Programare e-book.

Practic, în .NET o scurgere de memorie apare atunci când obiecte referite sunt înrădăcinate și, astfel, nu poate fi gunoi colectate. Acest lucru se întâmplă în mod accidental atunci când vă țineți pe referințe dincolo de domeniul de aplicare.

Te'll știu că ai scurgeri atunci când începe să obtinerea OutOfMemoryExceptions sau memorie de utilizare a merge dincolo de ceea ce v'd aștepta (PerfMon a de memorie frumos contoare).

Înțelegerea .NET's memorie model este cel mai bun mod de a evita asta. În mod specific, înțelegerea modului în colectorul de gunoi funcționează și cum referințe de lucru — din nou, a se vedea capitolul 7 din e-book. De asemenea, să fie conștienți de capcanele comune, probabil, cele mai frecvente fiind evenimente. Dacă obiect O este înregistrată la un eveniment pe obiect B, apoi obiectO se va lipi în jurul valorii de până obiect B dispare pentru că B detine o referință la O**. Soluția este să se retragă evenimente atunci când te're făcut.

Desigur, o memorie bună profil va permite să vedeți obiecte grafice și de a explora cuiburi/referințe de obiecte pentru a vedea în cazul în care referințele sunt și ce obiect rădăcină este responsabil (red-poarta furnici profil, JetBrains dotMemory, memprofiler sunt foarte bune alegeri, sau puteți utiliza numai text WinDbg și SOS, dar am'd recomand comercial/vizual produs dacă nu're un adevărat guru).

Cred unmanaged code este supusă sale tipice pierderi de memorie, cu excepția faptului că referințe comune sunt gestionate de către colectorul de gunoi. Am putea fi greșit despre acest ultim punct.

110
0
Comentarii (6)
 Coincoin
Coincoin
1 august 2008 в 5:52
2008-08-01T17:52:46+00:00
Mai mult
Sursă
Editează
#8406360

Strict vorbind, o scurgere de memorie este consumatoare de memorie, care este "nu mai este folosit" de program.

"Nu mai este folosit" are mai mult de un sens, aceasta ar putea însemna "nici o referire mai mult la ea", care este, total irecuperabil, sau poate însemna, de referință, recuperabile, nefolosite dar programul păstrează referințele oricum. Doar mai târziu se aplică .Net pentru perfect reușit de obiecte. Cu toate acestea, nu toate clasele sunt perfecte și la un moment dat, un fond al sistemului unmanaged punerea în aplicare ar putea scurge permanent resurse pentru acest proces.

În toate cazurile, cererea se consumă mai multă memorie decât este strict necesar. Părțile efecte, în funcție de cantitatea de scurgeri, ar putea merge la nici unul, pentru încetinire cauzată de colectarea excesivă, la o serie de memorie excepții și în cele din urmă o eroare fatală, urmat de forțat procesul de reziliere.

Stii o aplicație are o problemă de memorie atunci când monitorizarea arată că mai mult și mai mult de memorie este alocat pentru procesul de după fiecare colectare a gunoiului ciclu. În acest caz, vă sunt fie de a păstra prea mult în memorie, sau unele de fond al sistemului unmanaged punere în aplicare se scurge.

Pentru cele mai multe scurgeri de informații, resurse sunt recuperate atunci când procesul este terminat, cu toate acestea unele resurse nu sunt întotdeauna recuperate în unele cazuri precise, GDI cursorul mânerele sunt notorii pentru asta. Desigur, dacă aveți un mecanism de comunicație inter-proces, memorie alocate în alt proces nu va fi eliberat până când acest proces se eliberează sau se termină.

35
0
Comentarii (0)
 Martin
Martin
15 august 2008 в 4:11
2008-08-15T16:11:41+00:00
Mai mult
Sursă
Editează
#8406366

Cred ca "ce este o scurgere de memorie" și "care sunt efectele" întrebările au fost răspuns bine deja, dar am vrut să mai adaug câteva lucruri pe care alte întrebări...

Cum să înțeleagă dacă cererea dumneavoastră scurgeri

O modalitate interesantă este de a deschide perfmon și se adaugă urme de # bytes în toate heaps și # Gen 2 collections , în fiecare caz în căutarea doar la proces. Dacă exercită o anumită caracteristică cauze total de bytes pentru a crește, și că memoria rămâne alocate după următoarea generație a 2-colectarea, s-ar putea spune că funcția scurgeri de memorie.

Cum de a preveni

Alte opinii au fost date. Aș adăuga doar că, probabil, most frecvent overlooked cauza .NET pierderi de memorie este de a adăuga stivuitoare eveniment la obiecte fără a scoate-le. Un handler de eveniment atașat la un obiect este o formă de trimitere la acel obiect, astfel va preveni colectarea, chiar și după toate celelalte referințe au plecat. Întotdeauna amintiți-vă pentru a detașa stivuitoare eveniment (folosind -= sintaxa din C#).

Nu scurgere merge mai departe atunci când procesul de ieșiri, și ce despre COM interop?

Atunci când procesul ieșiri, toate de memorie mapate în spațiul de adrese este revendicată de către sistemul de OPERARE, inclusiv orice obiecte COM servit din Dll-uri. Relativ rar, COM objects poate fi servit la procese separate. În acest caz, atunci când procesul de ieșiri, ați putea fi în continuare responsabil pentru memorie alocate în orice COM server de procese pe care le-ai folosit.

32
0
Comentarii (0)
Eric  Z Beard
Eric Z Beard
14 august 2008 в 11:16
2008-08-14T23:16:39+00:00
Mai mult
Sursă
Editează
#8406365

Dacă aveți nevoie pentru a diagnostica o scurgere de memorie în .NET, verifica aceste link-uri:

http://msdn.microsoft.com/en-us/magazine/cc163833.aspx

http://msdn.microsoft.com/en-us/magazine/cc164138.aspx

Aceste articole descriu cum de a crea o imagine de memorie de proces și cum să-l analizeze, astfel încât să puteți determina mai întâi dacă scurgerea este unmanaged sau gestionate și, dacă este reușit, cum să-mi dau seama de unde vine de la.

Microsoft are, de asemenea, un nou instrument pentru a ajuta cu generatoare de gropile de accident, pentru a înlocui ADPlus, numit DebugDiag.

http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en

19
0
Comentarii (0)
 John
John
1 august 2008 в 5:57
2008-08-01T17:57:14+00:00
Mai mult
Sursă
Editează
#8406361

Aș defini pierderi de memorie, ca un obiect care nu se eliberează memoria alocată după ce l-a finalizat. Am găsit acest lucru se poate întâmpla în cererea dumneavoastră dacă utilizați Windows API și COM (adică unmanaged code că are un bug sau nu este gestionat corect), în cadrul și în terțe părți componente. Am găsit, de asemenea, nu curatenie dupa folosirea anumitor obiecte, cum ar fi pixuri poate provoca problema.

Eu personal am suferit de Memorie Excepții care pot fi cauzate, dar nu sunt exclusive pentru pierderi de memorie în dot net applications. (OOM poate veni, de asemenea, la fixarea vedea Fixarea Artical). Dacă nu sunteți obtinerea OOM erori sau aveți nevoie pentru a confirma dacă acesta este un cauzează scurgeri de memorie atunci singura cale este de a profil cererea dumneavoastră.

De asemenea, aș încerca și de a asigura următoarele:

a) Tot ceea ce implementează Idisposable sunt eliminate, fie folosind-o în cele din urmă bloc sau utilizarea declarație acestea includ pensule, pixuri etc.(unii oameni susțin pentru a seta totul pentru nimic în plus)

b)Ceva care are o metodă de închidere este închis din nou, folosind în cele din urmă sau utilizarea declarație (deși am găsit folosind nu întotdeauna aproape, în funcție dacă ai declarat obiect în afara folosind declarație)

c)Dacă utilizați unmanaged code/windows API's că acestea sunt tratate în mod corect după. (unele au metodele de curățare pentru a elibera resurse)

Sper că acest lucru vă ajută.

19
0
Comentarii (0)
 Nick
Nick
16 august 2008 в 7:54
2008-08-16T19:54:30+00:00
Mai mult
Sursă
Editează
#8406367

Folosind CLR Profiler de la Microsoft http://www.microsoft.com/downloads/details.aspx?familyid=86ce6052-d7f4-4aeb-9b7a-94635beebdda&displaylang=en este o modalitate foarte bună de a determina care obiecte sunt exploatație de memorie, ce fluxul de executie duce la crearea acestor obiecte, și, de asemenea, de monitorizare și de obiecte care trăiesc în cazul în care pe heap (fragmentarea, LOH, etc.).

16
0
Comentarii (0)
Gus Paul
Gus Paul
27 august 2008 в 2:12
2008-08-27T14:12:23+00:00
Mai mult
Sursă
Editează
#8406369

Cea mai bună explicație a cât de colectorul de gunoi de lucrări este în Jeff Richters CLR prin intermediul C# cartea, (Ch. 20). Lectură acest lucru vă oferă o mare de împământare pentru a înțelege modul în care obiectele persistă.

Una dintre cele mai comune cauze de înrădăcinare obiecte accidental este cuplat evenimente outisde o clasă. Dacă te cuplezi un eveniment extern

de exemplu

și uitați să scoateți-l atunci când aruncați, apoi SomeExternalClass are un ref la clasa ta.

După cum sa menționat mai sus, SciTech memorie profiler este excelent, în care vă arată rădăcinile de obiecte bănuiți sunt scurgeri.

Dar există, de asemenea, o modalitate foarte rapidă de a verifica un anumit tip este de a folosi doar WnDBG (puteți utiliza chiar și acest lucru în VS.NET în fereastra immediate în timp ce atașat):

!dumpheap -stat -type <TypeName>

Acum fac ceva care crezi că va dispune de obiecte de acel tip (de exemplu, aproape o fereastră). L's util aici pentru a avea o depanare buton pe undeva, care va rula Sistemul.GC.Colecta()` o de câteva ori.

Apoi run `!dumpheap -stat -tip din nou. Dacă numărul n't merge în jos, sau am't merge în jos la fel de mult cum vă așteptați, atunci ai o baza pentru investigații suplimentare. (Am primit acest sfat de la un seminar dat de Ingo Rammer).

15
0
Comentarii (0)
 Bernard
Bernard
1 august 2008 в 3:19
2008-08-01T15:19:25+00:00
Mai mult
Sursă
Editează
#8406357

Cred că într-un mediu gestionat, o scurgere de informații ar fi să vă menține o inutilă referință la o mare parte din memorie în apropiere.

14
0
Comentarii (0)
 neslekkiM
neslekkiM
1 septembrie 2008 в 12:19
2008-09-01T12:19:13+00:00
Mai mult
Sursă
Editează
#8406370

De ce oamenii cred că o scurgere de memorie în .NET nu este la fel ca orice altă scurgere de informații?

O scurgere de memorie este atunci când atașați la o resursă și nu lăsați-l să meargă. Puteți face acest lucru atat in reușit și în unmanaged de codificare.

În ceea ce privește .NET, și alte instrumente de programare, au fost idei despre colectarea gunoiului, și alte modalități de minimizare situații care vor face cerere de scurgere. Dar cea mai bună metodă de a preveni pierderi de memorie este de care aveți nevoie pentru a înțelege de fond al sistemului dvs. de model de memorie, și cum funcționează lucrurile, pe platforma utilizați.

Crezând că GC si alte magic va curăța mizeria ta este scurtă cale de la pierderi de memorie, și va fi dificil de a găsi mai târziu.

Atunci când codificare unmanaged, în mod normal, asigurați-vă că pentru a curăța, știi că resursele pe care le lua, va fi responsabilitatea ta pentru a curăța, nu îngrijitorul's.

În .NET pe de altă parte, o mulțime de oameni cred că GC va curăța totul. Ei bine, nu pentru tine, dar ai nevoie pentru a face sigur că așa este. .NET nu înfășurați o mulțime de lucruri, așa că nu știu întotdeauna dacă ai de-a face cu un administrate sau neadministrate de resurse, și aveți nevoie pentru a face sigur că ceea ce ceea ce ai're de-a face cu. Manipularea fonturi, GDI resurse, active directory, baze de date etc este de obicei lucrurile de care ai nevoie pentru a privi afară pentru.

In reușit ceea ce am să-mi pun gâtul pe linia să spun că nu pleacă odată procesul este ucis/eliminat.

Am vedea o mulțime de oameni au acest lucru, deși, și sper că asta se va termina. Nu poti cere utilizatorului de a rezilia aplicația pentru a curăța mizeria ta! Aruncati o privire la browser-ul, care poate fi IE, FF, etc, apoi deschideți, să zicem, Google Reader, lăsați-l să stea pentru câteva zile, și uite la ce se întâmplă.

Apoi, dacă se deschide un alt tab în browser-ul, naviga la unele site-ul, apoi închideți fila care a găzduit altă pagină care a făcut browser-ul scurgere, crezi că browser-ul va elibera memoria? Nu atât cu IE. Pe calculatorul meu IE va mânca cu ușurință 1gb de memorie într-un interval scurt de timp (aproximativ 3-4 zile) daca folosesc Google Reader. Unele newspages sunt chiar mai rău.

11
0
Comentarii (0)
 Seibar
Seibar
5 august 2008 в 10:47
2008-08-05T22:47:49+00:00
Mai mult
Sursă
Editează
#8406363

cred că într-un mediu gestionat, un scurgere de-ar fi să vă menține o inutile referință la o mare parte de memorie în apropiere.

Absolut. De asemenea, nu folosesc .Dispose() metoda pe obiecte de unică folosință, atunci când este cazul poate provoca mem scurgeri. Cel mai simplu mod de a face asta este cu ajutorul bloc, deoarece se execută în mod automat .Dispose() de la sfârșitul:

using(sr = new StreamReader("somefile.txt"))
{
    //do some stuff
}

Și dacă veți crea o clasă care utilizează unmanaged obiecte, daca're nu de punere în aplicare IDisposable corect, ar putea cauza pierderi de memorie pentru clasa ta's de utilizatori.

10
0
Comentarii (0)
 Josh
Josh
4 august 2008 в 2:09
2008-08-04T14:09:47+00:00
Mai mult
Sursă
Editează
#8406362

Toate pierderi de memorie sunt rezolvate prin programul de reziliere.

Scurgere de memorie suficient, iar Sistemul de Operare ar putea decide pentru a rezolva problema pe numele dumneavoastră.

9
0
Comentarii (0)
 Pat
Pat
1 august 2008 в 3:23
2008-08-01T15:23:33+00:00
Mai mult
Sursă
Editează
#8406358

Eu va acord cu Bernard ca la .net ce un mem scurgere ar fi.

Ai putea profil cererea dumneavoastră pentru a vedea utilizarea de memorie, și de a determina dacă gestionarea ei o mulțime de memorie atunci când nu ar trebui să fie ai putea spune că are o scurgere.

In reușit ceea ce am să-mi pun gâtul pe linie să spun că nu pleacă odată ce procesul este ucis/eliminat.

Unmanaged code este propriul său fiară și dacă există o scurgere în cadrul acestuia, va urma un standard de mem. scurgere de definiție.

8
0
Comentarii (0)
Joel Lucsy
Joel Lucsy
7 august 2008 в 1:17
2008-08-07T13:17:27+00:00
Mai mult
Sursă
Editează
#8406364

De asemenea, să păstreze în minte că .NET are două grămezi, una fiind obiect mare grămadă. Cred obiecte de aproximativ 85 de kilometri sau mai mari sunt puse pe acest morman. Movila aceasta are o altă viață reguli decât cele obișnuite heap.

Dacă sunteți crearea de memorie de mare de structuri (Dicționar's sau List's) ar fi prudent să meargă căutare ce exact care sunt regulile.

În măsura în recuperarea memoriei la terminarea procesului, cu excepția cazului în care rulează Win98 sau echivalente, totul este eliberat înapoi la sistemul de OPERARE de pe terminare. Singurele excepții sunt lucruri care sunt deschise cross-proces și un alt proces are încă resurse de a deschide.

COM Objects poate fi dificil tho. Dacă utilizați întotdeauna IDispose model, te'll fi în siguranță. Dar eu've rula peste câteva interop ansambluri care pune în aplicare IDispose. Cheia aici este de a apela Mareșal.ReleaseCOMObject când're făcut cu ea. COM Obiecte utiliza în continuare standard COM numărare de referință.

7
0
Comentarii (0)
Lars Truijens
Lars Truijens
20 august 2008 в 6:39
2008-08-20T18:39:25+00:00
Mai mult
Sursă
Editează
#8406368

Am găsit .Net Memorie Profiler un foarte bun ajutor atunci când găsirea pierderi de memorie în .Net. L's nu gratuit ca Microsoft CLR Profiler, dar este mai rapid și mai mult, până la punctul în opinia mea. O

6
0
Comentarii (0)
hemant kurmi
hemant kurmi
27 august 2014 в 3:22
2014-08-27T15:22:06+00:00
Mai mult
Sursă
Editează
#8406371

O definiție este: în Imposibilitatea de a elibera neatins de memorie, care nu mai pot fi alocate nou proces în timpul executării alocarea proces. Acesta poate fi vindecat cu ajutorul GC tehnici sau detectat de instrumente automatizate.

Pentru mai multe informații, vă rugăm să vizitați http://all-about-java-and-weblogic-server.blogspot.in/2014/01/what-is-memory-leak-in-java.html.

1
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RO
RU
© Answer-ID 2021
Sursă
https://stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire