Bellek mi sızdırıyor?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
snofru
Üye
Mesajlar: 204
Kayıt: 19 Ağu 2004 02:57
Konum: /local/usr/src
İletişim:

Bellek mi sızdırıyor?

Mesaj gönderen snofru »

S.A.

Auto-Create Nesnelerim
Giriş (Form)
Ana (Form)
ve 3 tane DataModule (toplamda 10 nesne barındırıyorlar)

Yapı
Giris (Application Form)
|
Ana (Giriş Hide olur)
|
- Form1
|
- Form2

Giriş formu geldiğinde bellek kullanım miktarı: 4.248K
Ana form açıldığında ise: 4.488K

Test Ediyoruz:

Ana (4.488K)
|
- Form1 (4.860K)
|
- Form2 (5.092K)

geriye geliyoruz

Form2 Kapandı Fom1'e döndüğümüzde 5.040K
Ana Form'a döndüğümüzde ise 4.924K

Ana Form üzerinden kaybedilen bellek miktarı hesaplandığında: 436K ediyor.

Başlangış değerin olarak Ana form esas alınıyor ve tekrar deniyoruz
(Ana formdayız ve şuan ki bellek kullanımı 4.924K)

Ana (4.924K)
|
- Form1 (5.004K)
|
- Form2 (5.100K)

Ana Form'a döndüğümüzde ise 5.380K

Bellek sızıntısı 465K

3. kez testi yapıyorum
Ana (5.380K)
|
- Form1 (5.400K)
|
- Form2 (5.464K)

Ana forma dönüyorum 5.312
Bellek sızıntısı +312K kazançlı çıkıyoruz :) gerçi ben bu metni yazarken 5.404 olmuş 12K yı araklamış findows

Seri bir şekilde Fom1 Fom2 yi çağırıp ana forma dönüyorum bakalım ne olacak testleri yapıyorum
~20 test yaptım ama artık sabit kalıyor. Ana fom işlem sonrası dönüş değeleri hep; 5.404K

Programı minimize yapıyorum 392K, tekrar maximize yapınca (30 sn bekledim yükselirmi diye) 1.592K
Mevcut işlemleri yapıyorum ana forma dönüyorum ve 3.116K :[
Yani neymiş; findows uygulamalarını arada bir minimize yapmak bellekten kurtarmakmış...
Seri olarak 8-10 test yapıyorum ve hep Ana form a dönüş değeri hep 3.120K oluyor, ilginç!

ve bundan sonrada yaptığım testlerde 3.120K sınırının üstünde bir Ana form bekleme bellek miktarı elde etmedim.
Eee noldu 5.300K lardan buralara (3.120K) nasıl geldik?


Formların yaratıldığı ve free edildiği komutlar
Yaratma (ihtiyaç duyduğumda yani gösterimden önce)
FormX := TFormX.Create(Application);
FormX.ShowModal;


Free Etme (ilgili formun OnClose olayında)
Action := caFree;
FormX := nil;



Sizce ben mi bellek sızıntısı yapıyorum yoksa Findows da işler böyle mi yürüyor?

Saygılar...

Taner DOĞAN
App. Dev.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Form larını Create Etmeden önce Nil kontrolü yapmanı tafsiye ederim.


Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
snofru
Üye
Mesajlar: 204
Kayıt: 19 Ağu 2004 02:57
Konum: /local/usr/src
İletişim:

Mesaj gönderen snofru »

Hüseyin abi tavsiyeni dikkate alacağım, çok teşekkür ederim...

Taner DOĞAN
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Memory leak olmak zorunda değil. Aslında Windows'da işler böyle yürüyor. Aldığın belleği free ettiğinde Windows hemen geri vermeyebilir. Çalışma mantığı şu, sen yeniden bellek isteyebilirsin diye Windows belleği cache'ler, sen istediğinde de hemen geri verir. Yani belleği yeniden ayır, hesapla, gerekirse diskten yer ayır vs.. ile uğraşmamak için bunu yapar. Aslında memory leak'i belirleyen programlar da mevcut. Mesela memory sleuth vardı. Programını kendi ayırdığı bellek bölgesinde çalıştırıp, başlangıç ve sondaki bellek değerini karşılaştırıyordu.

En güzeli kodlarken dikkat göstermek. Ayırdığın bellek bölümüyle işin biter bitmez free etmek, bellek ayırdıktan sonraki kodu try finally içine alıp belleğin free edildiğinden emin olmak.
Cevapla