Form oluşturulduğunda rezerve edilen belleğin iadesi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Form oluşturulduğunda rezerve edilen belleğin iadesi

Mesaj gönderen aLonE CoDeR »

Selamlar;

Türetilmiş bir formu (MDIChild) create ettiğimde örneğin 100-200 KB kadar bellekte artış gözlemliyorum, formu kapattığımda free etmeme rağmen (nil de etsem) kullanılan bellekte düşme olmuyor, iade edilmiyor. Konu forumda çok konuşuldu, geçmiş konuları da taradım tekrardan ama sonuç olumsuz. FastMM kullandım yine değişen olmadı ve oluşan leak'lere baktığımda bazı üçüncü parti bileşenlerin de buna sebebiyet verdiğini gözlemledim. Bunun dışında yeni bir proje oluşturup standart nesnelerle işlem yaptığında rezerve edilen belleğin tamamı iade edilmesine rağmen TEdit sınıfından türettiğim ve içinde başka sınıfları create/free ettiğim bir nesneyi bu yeni (ve boş) projede kullandığımda da aynı şekilde bellek iadesi yapılmadı :roll: Neredeyse create ettiğim her şeyi free edip duruma göre nil de atamama rağmen bu hergele neye kızıyor olabilir ki?
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Form oluşturulduğunda rezerve edilen belleğin iadesi

Mesaj gönderen esistem »

Selam;
"Türetilmiş bir formu (MDIChild) create ettiğimde örneğin 100-200 KB kadar bellekte artış gözlemliyorum," demişsiniz, peki bu artış formu her create ettiğinizde devam ediyormu ? eğer etmiyorsa sorun yok demektir.

Bu arada bende şimdi denedim sorun yok, create edince 250-300 kb kadar gidiyor, yok edince geri geliyor.
OnClose eventim :
CARI_HESAPLAR:=NIL;
RELEASE;
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Form oluşturulduğunda rezerve edilen belleğin iadesi

Mesaj gönderen aLonE CoDeR »

Evet her oluşturma işleminde artarak devam ediyor ve geri vermiyor. Release de denemiştim, değişen bir şey olmuyor.
Kullanıcı avatarı
barutali
Üye
Mesajlar: 297
Kayıt: 02 Tem 2007 02:30

Re: Form oluşturulduğunda rezerve edilen belleğin iadesi

Mesaj gönderen barutali »

SetProcessWorkingSetSize apisini kullanabilirsiniz..


SetProcessWorkingSetSize(GetCurrentProcess, $ffffffff, $ffffffff);
amatör küme programcı :D
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Form oluşturulduğunda rezerve edilen belleğin iadesi

Mesaj gönderen aLonE CoDeR »

Ali kardeşim, bu api'yi GetCurrentProcess parametresiyle değil de Handle parametresiyle denemiştim ve sonuç alamamıştım şimdi senin örneğinle denedim çok ilginç bir sonuçla karşılaştım, şöyle ki; uygulamayı ilk çalıştırdığımda yaklaşık olarak 10 Mb bellek kullanımıyla başlıyor, yeni bir form oluşturulduğunda takriben 100-200 Kb artıyor ve formu free ettikten sonra önerdiğin api'yi çağırdığımda uygulamanın kullandığı bellek miktarı yaklaşık 5 Mb civarına düşüyor :shock: Bu nasıl bir bellek yönetimidir yahu :D Teşekkürlerimle..
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Form oluşturulduğunda rezerve edilen belleğin iadesi

Mesaj gönderen ikra »

Kod: Tümünü seç

SetProcessWorkingSetSize(GetCurrentProcess, $ffffffff, $ffffffff);
evet Private-Bellek üzerinde oynama yapiyor fakat bu rakam Fake!
programin gercekte harcadigi (kapladigi alan) rezerve edilmis bellek sütununda gösteriliyor.

bence yukaridaki kodu kullanmak zorunda olmak, isletim sisteminin Memory-Management mantigina ters.

Rezerve edilen alan free edildiginde geri verilmis olmali.
Geri verilmeyen alan'in ise SetProcessWorkingSetSize(GetCurrentProcess, $ffffffff, $ffffffff) prosedürü ile cebren geri iade edilmesi var olan bilesenlerin rezerve edilmis alanina tecavüz olur. Bu durumda Access Violation hatasi kacinilmazdir.

Bunun baska yolu olmali.
kıdemsiz üye
Cevapla