C#nedir?com Homepage
Forum Home Forum Home > C# / .NET > C#
  New Posts New Posts RSS Feed - nesneyi hafızadan silme
  FAQ FAQ  Forum Search   Events   Register Register  Login Login

nesneyi hafızadan silme

 Post Reply Post Reply
   

Author
Message
akipek View Drop Down
Senior Member
Senior Member


Joined: 04 Ekim 2005
Location: Türkiye
Status: Offline
Points: 335
Post Options Post Options   Thanks (0) Thanks(0)   Quote akipek Quote  Post ReplyReply Direct Link To This Post Topic: nesneyi hafızadan silme
    Posted: 20 Kasım 2008 at 15:28
class içinde bi nesne var bunu
Header h1 = new Header();
:
:
:
şeklinde oluşturup kullanıyorum işim bitince bunu silmek gerekiyormu hafızadan gerekiyorsa nasıl ?
Back to Top
seser View Drop Down
Senior Member
Senior Member


Joined: 04 Temmuz 2005
Status: Offline
Points: 4654
Post Options Post Options   Thanks (0) Thanks(0)   Quote seser Quote  Post ReplyReply Direct Link To This Post Posted: 20 Kasım 2008 at 21:12
Garbage Collector nesnenin işi bittiğinde (artık ulaşılabilir olmadığında) hafızadan nesneyi kaldırır.

Senin bir şey yapmana gerek yok.

nesne = null;
nesne.Dispose();

gibi şeyler denenebilir ama .net ortamında hafıza yönetimini biz yapmadığımız için yine de gc'yi beklemek zorundasın.


Edited by seser - 20 Kasım 2008 at 21:12
acil durumda camı kırınız!
Back to Top
msusur View Drop Down
Groupie
Groupie


Joined: 22 Temmuz 2007
Status: Offline
Points: 155
Post Options Post Options   Thanks (0) Thanks(0)   Quote msusur Quote  Post ReplyReply Direct Link To This Post Posted: 20 Kasım 2008 at 23:52
aslında gc yi kendin de çağırabilirsin, bazı durumlarda gc beklemek sorun olabilir. Örneğin güvenlik açısından ve hafızanın şişmesi durumunda vs.. bu gibi durumlarda GC.Collect(); denebilir.
Back to Top
dotnet View Drop Down
Senior Member
Senior Member


Joined: 31 Ekim 2007
Status: Offline
Points: 420
Post Options Post Options   Thanks (0) Thanks(0)   Quote dotnet Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 08:01
System.GC.SupressFinalize(nesne);
ile nesne hafızadan kaldırılabilir.


Edited by dotnet - 21 Kasım 2008 at 08:02
paylaşmak güzeldir:)
Back to Top
seser View Drop Down
Senior Member
Senior Member


Joined: 04 Temmuz 2005
Status: Offline
Points: 4654
Post Options Post Options   Thanks (0) Thanks(0)   Quote seser Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 08:15
http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx


SuppressFinalize nesneyi ram'den kaldırmaz aksine kaldırılmasını engeller
acil durumda camı kırınız!
Back to Top
dotnet View Drop Down
Senior Member
Senior Member


Joined: 31 Ekim 2007
Status: Offline
Points: 420
Post Options Post Options   Thanks (0) Thanks(0)   Quote dotnet Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 08:41
ben bu kodu C# 2005 zirvedeki beyinler kitabından almıştım. ve orada öyle yazıyordu. eğer dediğin doğruysa benim için felaket .. :(
paylaşmak güzeldir:)
Back to Top
dotnet View Drop Down
Senior Member
Senior Member


Joined: 31 Ekim 2007
Status: Offline
Points: 420
Post Options Post Options   Thanks (0) Thanks(0)   Quote dotnet Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 08:51
memik yanık 'ın kitabından aynen
 
Şimdi yukarıda hazırladığım uygulamada değişiklik yapacağım. Uygulamanın ilk halinde “Nesne Yoket” başlıklı düğme tıklandığında GC’ı kendim devreye sokacağım. Bu amaçla hazırladığım kodu aşağıda görebilirsiniz.

private void yok_et_Click(object sender, EventArgs e)
{
System.GC.SuppressFinalize(this);
}

Bu kod işletildiğinde o sırada GC sınıfının SupperssFinalize metoduna parametre olarak verilen sınıftan türetilen ve artık gerek duyulmayan nesneler varsa bunlar GC tarafından bellekten temizlenir.
paylaşmak güzeldir:)
Back to Top
seser View Drop Down
Senior Member
Senior Member


Joined: 04 Temmuz 2005
Status: Offline
Points: 4654
Post Options Post Options   Thanks (0) Thanks(0)   Quote seser Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 09:01
MSDN sitesinden

Requests that the system not call the finalizer for the specified object.

türkçe meali

Sistemden bu nesne için destruct (yokedici) metodunun çağırılmamasını ister.

aslında yokedici metod (finalizer) yazılmamışsa bir şey değişmez. Eğer yazıyorsanız (ben yazıyorum) o zaman sıkıntı olabilir.
acil durumda camı kırınız!
Back to Top
dotnet View Drop Down
Senior Member
Senior Member


Joined: 31 Ekim 2007
Status: Offline
Points: 420
Post Options Post Options   Thanks (0) Thanks(0)   Quote dotnet Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 09:06

zeten yok edici metot olarak

System.GC.SuppressFinalize(nesne);
 
yazılmıyor mu?
 
o zaman bunu kullanarak nesneyi hafızadan kaldırabiliriz.
Yanlış anlıyorsam düzelt lütfen 
paylaşmak güzeldir:)
Back to Top
akipek View Drop Down
Senior Member
Senior Member


Joined: 04 Ekim 2005
Location: Türkiye
Status: Offline
Points: 335
Post Options Post Options   Thanks (0) Thanks(0)   Quote akipek Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 09:10
yani kısaca birşey koymaya gerek olmadığını söylüyorsunuz. Çok teşekkür ederim yardımlarınız için.
Back to Top
seser View Drop Down
Senior Member
Senior Member


Joined: 04 Temmuz 2005
Status: Offline
Points: 4654
Post Options Post Options   Thanks (0) Thanks(0)   Quote seser Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 09:11
public class myClass
{
//değişkenler

public myClass()
{
    //yapıcı metod
    
}
~myClass()
{
     //yok edici metod
     //burada bu sınıf içinde tanımlı olan ve sonlandırılması gerekebilecek,
     //örn. kendi yazdığım başka bir sınıf
     //değişkenlerini sonlandırılır.
}
}

acil durumda camı kırınız!
Back to Top
msusur View Drop Down
Groupie
Groupie


Joined: 22 Temmuz 2007
Status: Offline
Points: 155
Post Options Post Options   Thanks (0) Thanks(0)   Quote msusur Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 09:14
İyi de Suppress, bastırmak demek. Finalize denilen method şu işe yarar, diyelim ki bir değişken var ve bu değişken scope dışına çıktı. İşte erişilememeye başladığında finalize methodu çağırılır. Eğer sen bu nesne için suppress edersen bu nesne finalize edilmez. MSDN'den alıntı;

Finalize is protected and, therefore, is accessible only through this class or a derived class.

This method is automatically called after an object becomes inaccessible, unless the object has been exempted from finalization by a call to SuppressFinalize

türkçe çevirisi ise tam yukarıda anlattığım şey. Memik Yanık'ı birinin uyarması lazım bence.
Back to Top
msusur View Drop Down
Groupie
Groupie


Joined: 22 Temmuz 2007
Status: Offline
Points: 155
Post Options Post Options   Thanks (0) Thanks(0)   Quote msusur Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 09:18
Originally posted by akipek akipek wrote:

yani kısaca birşey koymaya gerek olmadığını söylüyorsunuz. Çok teşekkür ederim yardımlarınız için.

GC belirli interval ile sistemi tarar ve IDisposable dan türeyen nesneleri temizler. Normalde bir değişken scope dışına çıkarsa elbette ilk intervalda silinecektir. Fakat elindeki nesne içindeki bilgiler çok önemliyse ya da anormal boyutlara ulaşıyorsa o zaman scope dışında sen GC.Collect i çağırarak interval i beklemeyebilirsin. Ama bunun dışında özel birşey yapmana gerek yok.
Back to Top
dotnet View Drop Down
Senior Member
Senior Member


Joined: 31 Ekim 2007
Status: Offline
Points: 420
Post Options Post Options   Thanks (0) Thanks(0)   Quote dotnet Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 10:26
Eğer Şuan ulaşabilseydim  Zirvedeki beyinler C# 2005 kitabında da aynısını yazdığını aynı cümlelerle burada yazacaktım. (sadece memik yanık değil)
paylaşmak güzeldir:)
Back to Top
msusur View Drop Down
Groupie
Groupie


Joined: 22 Temmuz 2007
Status: Offline
Points: 155
Post Options Post Options   Thanks (0) Thanks(0)   Quote msusur Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 11:29
buraya bir bakalım bence birşeyler yavaş yavaş açığa çıkıyor :)

http://memikyanik.blogspot.com/2007/10/zirvedeki-beyinlerin-hakaret-davas.html
Back to Top
dotnet View Drop Down
Senior Member
Senior Member


Joined: 31 Ekim 2007
Status: Offline
Points: 420
Post Options Post Options   Thanks (0) Thanks(0)   Quote dotnet Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 11:51
ben aynı cümlelerle derken yanlış anlaşılmasın aynı şeyi anlatıyor dedim
yani her iki kitap da supresfinalize nesneyi hafızadan kaldırır diyor.
paylaşmak güzeldir:)
Back to Top
Jackson View Drop Down
Senior Member
Senior Member

Üyeliği sınırsız süreyle durduruldu!

Joined: 11 Ocak 2007
Status: Offline
Points: 776
Post Options Post Options   Thanks (0) Thanks(0)   Quote Jackson Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 12:24
Arkadaşlar çok güzel bir konuya girmişsiniz sitedede benzer bir makale var ama benimde biraz kafam karıştı bu konuda sitedeki makaleden aşağıdaki kısmı biraz uzun olsada buraya eklemek istedim  aşağıdaki makaleden anladığım IDiposable arayüzünü implement ederek SuppressFinalize metodu ile bu işin yapılabilceği şeklinde ama daha öncede farklı forumlarda bu konuyu tartıştık herkes bu konuda farklı bir görüş bildiriyor makalenin adresinide ekliyorum makaleyi yazan Sayın Burak Selim ŞENYURT eğer bu konuyu okuyorsa kendiside bizi aydınlatabilirmi acaba
 
 
"Çoğunlukla new operatörü ile gerçekleştirilen bu işlemin ardından nesne uygulama içerisinde kullanılır. Kullanım sona erdiğinde ve nesne scope (kapsama alanı) dışına çıktığında kullanılamaz hale gelir. Bu makalenin başında belirttiğimiz gibi nesneye ait kaynakların serbest bırakılması anlamına gelmez. Sadece referans yok edilmiştir. Daha sonra nesnemiz sonlandırılabilir hale gelir ve nesne ömrü sonlandırılır. Sonlandırma işleminde genellikle nesne içerisinde var olan unmanaged referansların bellekten atılması işlemi gerçekleştirilir. Nihayetinde sonlandırılmış nesneye ait bellek bölgeleri serbest bırakılır. İşte biz Dispose metodunu ve SuppressFinalize metodunu kullanarak sonlandırma aşamasını otomatik olarak atlayabilir ve nesneye ait kaynakların iade edilmesini sağlayabiliriz."
 
Peki böyle bir imkan var ise neden sonlandırma süreci söz konusudur? Managed olarak oluşturulmuş nesneler GC kontrolünde yok edilirler. Ancak içerisinde unmanaged referanslar var ise, bu referansların açıkça yok edilmeleri bir başka deyişle kaynaklarının serbest bırakılmaları gerekir. Oysaki GC bu işlemin nasıl yapılabileceğini tahmin edemez. Bu tarz durumlarda unmanaged referanslara ait kaynakları serbest bırakmak için nesnelerin destructor metodlarından faydalanılabilir. Diğer yandan her nesne için GC tarafından yönetilen bir sonlandırma kuyruğu(finalizable queue) söz konusudur. Bu kuyruk finalize edilebilir nesneleri tutan bir koleksiyondur. GC oluşturulan nesneler için buraya giriş yapar ve nesne sonlandırma sürecine girdiğinde ilgili sonlandırma işlemini uygulayacağı nesne bilgilerini almak için yine bu kuyruğu kullanır. Eğer ki Dispose etmek istediğimiz nesnenin unmanaged referansları varsa bunlarıda dispose işlemi ile birlikte anında serbest bırakmak için GC sınıfının SuppressFinalize metodu kullanılabilir.
 
Bu koşullar göz önüne alındığında çoğunlukla kullanılan bir desen vardır. Bu desende hem IDisposable arayüzü implemente edilir hemde sınıfa ait desctructor (yokedici) metod kullanılır. Desctructor metodlar bildiğiniz gibi nesne GC tarafından yok edilmeden önce çalışan son metoddur. Burada çoğunlukla unmanaged referansların serbest bırakılma işlemleri ele alınır
 

Bu desendeki yaklaşım kısaca şudur; nesnemizi eğer Dispose metodunu kullanarak çağırırsak bu durumda overload ettiğimiz ve sadece bu sınıftan türeyen sınıflar tarafından erişilip override edilebilen Dispose metodu devreye girecektir. Bu metod içerisinde managed kodlarımız için gerekli temizleme işlemleri yapılır. Hemen ardından da unmanaged kaynaklar silinir. Peki desctructor metodu neden kullanıyoruz?

Nesnemizin illede açıkça Dispose edilmesi gibi biri durum söz konusu değildir. Pekala, nesne doğal yollardan scope dışına çıktığında GC tarafından serbest bırakılabilir. İşte bu serbest bırakma anından hemen önce desctructor metodu devreye girmektedir. Desctructor metodumuzdan yine overload ettiğimi virtual Dispose metodumuzu çağırırız. Ancak bu kez managed kaynaklar zaten GC tarafından serbest bırakılacağından durumu müdahale etmeyiz. Bu yüzden metoda parametre false olarak gönderilir. Ancak yine de unmanaged kaynaklar bizim tarafımızdan serbest bırakılacaktır.  Son olarak Dipose metodumuzda kullandığımız GC.SuppressFinalize metod çağırımı ile o anki nesneye ait sonlandırma kuyruğundaki kaynaklarıda serbest bırakmış oluruz

 

Back to Top
msusur View Drop Down
Groupie
Groupie


Joined: 22 Temmuz 2007
Status: Offline
Points: 155
Post Options Post Options   Thanks (0) Thanks(0)   Quote msusur Quote  Post ReplyReply Direct Link To This Post Posted: 21 Kasım 2008 at 13:44
Anladığım kadarıyla olay şundan ibaret, şimdi IDisposable dan türeyen bir sınıfı gc topluyor dedik. Dispose olayında biz işlerimizi yaptık diyelim. GC yeniden bu nesneyi toplamaya gelecektir, bu aşama eğer GC.SuppressFinalize(this) dersek aslında GC ye "arkadaş biz işimizi hallettik gelme" demiş oluyoruz. Bu method un başka kullanım alanı da olabilir, örneğin silinmesini de istemeyebiliriz bellekten? Neyse tekrar register etmek için ise GC.ReRegisterForFinalize() methodunu kullanabiliyoruz.

Doğru mu anladım? Eğer doğru anladıysak Memik Yanık olayı çok doğru anlatamamış ya da anlamamış. Fikirlerinizi bekliyorum.
Back to Top
dotnet View Drop Down
Senior Member
Senior Member


Joined: 31 Ekim 2007
Status: Offline
Points: 420
Post Options Post Options   Thanks (0) Thanks(0)   Quote dotnet Quote  Post ReplyReply Direct Link To This Post Posted: 23 Kasım 2008 at 15:36

Zirvedeki beyinler Visual C#.Net 2005 Kitabından Aynen Alıntı...
(Sayfa 292)

Garbage Collector

Bellekte oluşan atıl nesneleri (Çöpleri) temizlemek için garbage collector sınıfından faydalanılır. Aslında her kullanıcı tanımlı classa eklenmesi ve üzerinde performans açısından yüzde yüz durulması gerekmektedir. Class içerisindeki prosedür ile aynı classı temizleme işlemi aşağıdaki şekilde yapılmaktadır.

namespace Siniflar2
{
 class SinifA
 {
  public void SinifATemizle()
  {
   System.GC.SuppressFinalize(this);// Temizle
  }
 } 

 
"GC.SuppressFinalize" metodu kullanılarak aktif class bellekten temizlenmektedir.

Kitapta verilen Örnek Şöyle

SinifA Yeni =new SinifA();
.
.
.
Yeni.SinifATemizle();//Nesneyi Temizle

...

Şeklinde devam ediyor. (Hepsini yazamam, merak eden yada inanmayan kitaptan okuyabilir.)

 
 Bu durumda aklıma iki şey geliyor. Ya Türkçe kaynaklar MSDN'i bilmiyorlar, Yada MSDN De yazılanı Yanlış anlıyoruz...
paylaşmak güzeldir:)
Back to Top
 Post Reply Post Reply
  Share Topic   
   


Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 11.01
Copyright ©2001-2014 Web Wiz Ltd.