[eaf] Re: Referencia számlálás

  • From: Zimler Attila Tamas <hijaszu@xxxxxxxxxxxx>
  • To: eaf@xxxxxxxxxxxxx
  • Date: Thu, 08 May 2008 04:20:37 +0200

Podoski Peter wrote:
Szia Hijaszu!


Érdekes felvetés, de tudomásom szerint menedzselt memóriakezelésű
környezetben ilyen alacsony szintű felügyelést nem lehet csinálni. Amikor
C++-ban egy auto_ptr-rel burkolt hivatkozás kikerül a scope-ból, akkor
determinisztikusan meghívódik a burkoló destruktora, vagyis le tudod kezelni
ezt az eseményt. A Garbage Collector ugye ezzel szemben indeterminisztikusra
van tervezve, pont azért, mert ha nem indokolt, akkor nem törődik a memória
felszabadításával. (a számítási teljesítmény javítása miatt)
Sejtettem, hogy ezt az aspektust valaki meg fogja említeni. Nos, pont a szemétgyűjtő algoritmus működése okozza azt a problémát, amelyet fel kellene deríteni. A szó klasszikus értelmében nem, valójában viszont mégis szivárog a memória az alkalmazásból. (Megvannak a blokkok, meg is találná őket a .NET, ha elkezdené őket keresni, csak éppen elfogynak a window handle-ek az operációs rendszeren, mivel többek között az TableLayoutPanel.Controls.Clear() hívás ugyan eltávolítja a referenciákat adott objektumra, viszont idézet a hozzá kapcsolódó dokumentációból
(http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx):

"
*Important Note:*

Calling the Clear method does not remove control handles from memory. You must explicitly call the Dispose <http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dispose.aspx> method to avoid memory leaks.


"

Azaz, nekem kifejezetten meg kell hívnom az összes benne lévő objektumra a Dispose-t ilyenkor. Ez nagyjából el is fogadható lenne, ha nem lenne a fenti általános tévképzet, hogy majd a keretrendszer megoldja. Ennek köszönhetően, ezt senki sem tette meg a programunkban, és most fel kellene deríteni a hibát, hogy hol szivárog a memória. Igen ám, csak mivel a szó klasszikus értelmében nem szivárog (tekintve, hogy a Garbage Collection megtalálná, ha akarná, csak valahogy a belső rendszer továbbra is referál rá azért mert volt Dispose), nem tudom megtalálni azokat az objektumokat, amelyeket már fel kellett volna szabítani. (Profiler eszközzel sem, mert csak azt látom, hogy gyűlik a memória blokk, azt nem tudom megjelölni, hogy melyek azok amelyeknek már nem kéne ott lenni.)

A kérdés azért merült fel bennem, mert valahogyan meg kellene jelölnöm, hogy ki az az objektum, aki már illegálisan tartózkodik a memóriában. (És ugye Porkoláb Tanár Úrtól tudjuk, hogy ZH alatt így lehet a diákon számon kérni a megfelelő mennyiségű memória felszabadítást:)
Az én ötletem az lett volna, hogy elindulok az IDisposable interfész
irányába, és a Dispose() metódusba valamilyen globális osztálynak szólok,
hogy az objektum felszabadította magát. Csakhogy ez nem referenciaszámlálás,
hanem explicit fel- és leregisztráció valami központi nyilvántartásba, a
célod pedig nem ez volt, ez így túl "bürokratikus". :)
A fenti miatt automatikus megoldás kellene találni, mert egy már létező kódot nem lehet egy "írjuk át mindenhol" módon javítani (mivan, ha nem sikerül mindenhol rendesen átírni stb...).
Jóllehet C#-ban is meg tudsz adni destruktort (vagy akár Finalize()-ot), de
amennyiben egy központi (statikus) helyen mindig ott csücsül egy referencia
a számlált objektumra, azt sohasem fogja összegereblyézni a GC.
Ez nem lenne probléma jelen esetben, mert így sem gereblyézi össze a GC őket, ez a probléma :D. (Ennyit arról, hogy majd a nyelv valamit megcsinál a programozó helyett.)
Ha magasabb szinten képzelted a dolgot, akkor viszont ajánlható egy design
pattern a problémára. Mert ha pl. az asztali alkalmazás User Interface-én
keresztül globálisan értesülni akarsz különféle modellbeli eseményekről,
akkor az MVC/P architekturális tervminta felhasználható ilyen célra.

Szabad megtudni, milyen megfontolásból akarsz saját referencia számlálót
írni?
Lásd a problémát fenn.
pody

-----Original Message-----
From: eaf-bounce@xxxxxxxxxxxxx [mailto:eaf-bounce@xxxxxxxxxxxxx] On Behalf
Of Zimler Attila Tamas
Sent: Wednesday, May 07, 2008 9:32 PM
To: eaf@xxxxxxxxxxxxx
Subject: [eaf] Referencia számlálás

Sziasztok,

Van valakinek ötlete hogyan lehetne implementálni referencia számlálást
C# nyelven? :)
Hasonlóra gondolok, mint a C++-ban az auto_ptr :)

H.

--
Az eletben vannak szabalyok
Nehanyat meg lehet kerulni, a tobbit pedig meg lehet szegni
(The Matrix)

--
Az eletben vannak szabalyok
Nehanyat meg lehet kerulni, a tobbit pedig meg lehet szegni
(The Matrix)

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: OpenKeyServer v1.2
Comment: Extracted from belgium.keyserver.net

mQGiBEE/HTYRBACInacMGc8B/lkX3CXh5D9wUDlmza4hoatNZjJmWNnPWC9c0h2V
Pi9zYJ1bVqeUnNDzCRpovPdwrswWvb9WpVOS0A7TafzWxCYud6gN8g5KiC7cSuJV
cxI0uv3jWSjUkLnECqTpm9piM4WptXrdFLxUyrKPu+Nl82QSjfdbB+8xXwCg+rWO
KeOZZGGGIYWu+rZ0M/MqyCUD/jqQVc7alF8+5y//zNDml3THTc3ljK8CLcHxFv6F
uADmvHSePRTR1ACBV3dTxL8awvanRsXC25LOuYgM1hF9RRwof59xNtXVttvo724b
FDR+oRDVKyoEm6Istfn9xbbNqRqPfk83SHvect/hlHsfgaTBKd+IRAEkbMIdRin/
E45fA/0bzklqLGj4a8qSxMMvZ1Ib+2RmH5I6o9o33FY3Nmc7IEXJizyTyQaASYCx
ldjuRmfWSOP3gQRrH5owuZq5KBCC/PNMNnUsA4noFmvIilA/9UYqMtQ0BNr+miIM
9/LV70ZbBHVpDLjb2baMjbKrmCFf9rjlc17fFsWk5ZJuE3/UxLQrWmltbGVyIEF0
dGlsYSBUYW3DoXMgPGhpamFzenVAaGxmc2xpbnV4Lmh1PohXBBMRAgAXBQJBPx02
BQsHCgMEAxUDAgMWAgECF4AACgkQ+3OFVYni0PSysACffD6VDtoer3aBe8Gpvn8e
gwiNNH8AmwcmBIrZeCOeobIuZZp3CCOgQblIuQENBEE/HTkQBACKNzv7gS0fgeiO
AMoss2bbO7X9GuO3ufc3+zx2yGV7SvYAuyWLOSMhs1ZYBVp6IawDY88zEx81oxRj
Jd4zO8h/3BI9cmjZ4NAmdv7lWjTs0I0ijFnemcFQaffxN8vIB9DqA4oyJ0A/bS7J
0E/i13sr7hRgB6NZbpy4PSSkczggvwADBQP8D3eakqeJHf1yLmw1XmQVDxHLxtrI
VL0TShFEfMGU/MLfKpcmrd43EsSondsNNm8jv4b9Y/Wgc8XPQQrfPodC5mKt8mQC
F/ovWBFs46YvhS5pojQmp6i9octTWw2OqVn3QgrBFqm4QvayLE9wRLm/xgaFApVI
4RiOOEA6SidURGCIRgQYEQIABgUCQT8dOQAKCRD7c4VVieLQ9HoZAJ4xR5Y1qlnC
LTn1GkbEW0Va+72EqwCfQTP37ylZGrvpYnFoewBIMuLFHM8=
=K0/l
-----END PGP PUBLIC KEY BLOCK-----


Other related posts: