Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
EMemoryLeak
#1
Merhaba
Hata Tipi EMemoryLeak
Application has leaked memory hatası hangi durumlarda düşer bilgisi olan arkadaşlar paylaşabilir mi ?
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
Projeniz bilgisayar hafızasından ödünç alınan yerde çalışır. 

Programdan çıkışta tüm bu alanı iade etmeniz laxım. 

Hesabı eksik öderseniz müessese sahibi hesap sorar. Hesap hatasını görmezden de gelemezsiniz ki hata vermesin demek olmaz.

Dolayısıyla hesabınızı tuttunuz ama konuklarınızdan birinin yediğini bulamadınız. İşte bu durum o durum. 

Projenin açılışına şu satırı ekleyin :

ReportMemoryLeaksOnShutdown := True;

Size en azından hangi tipten açık verdiğinizi mesaj penceresi ile bildirir.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
Muharrem hocam bu hata bastırılabiliyor fakat sistem ara ara beklenmedik zamanlarda hata ayıklamaya düşüyor sebebi bu olabilir mi
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#4
Aynen doğrudur.
Müessese sahibi bu açık ard arda sürerse iflas eder.
Sistemde senin projenin hafıza ihtiyacı gereksiz yere şişer ve stabilite bozulur.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
(10-03-2018, Saat: 18:27)mrmarman Adlı Kullanıcıdan Alıntı: Aynen doğrudur.
Müessese sahibi bu açık ard arda sürerse iflas eder.
Sistemde senin projenin hafıza ihtiyacı gereksiz yere şişer ve stabilite bozulur.

Çok Teşekkürler Hocam Saygılar Smile
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#6
(10-03-2018, Saat: 17:54)mrmarman Adlı Kullanıcıdan Alıntı: Projeniz bilgisayar hafızasından ödünç alınan yerde çalışır. 

Programdan çıkışta tüm bu alanı iade etmeniz laxım. 

Hesabı eksik öderseniz müessese sahibi hesap sorar. Hesap hatasını görmezden de gelemezsiniz ki hata vermesin demek olmaz.

Dolayısıyla hesabınızı tuttunuz ama konuklarınızdan birinin yediğini bulamadınız. İşte bu durum o durum. 

Projenin açılışına şu satırı ekleyin :

ReportMemoryLeaksOnShutdown := True;

Size en azından hangi tipten açık verdiğinizi mesaj penceresi ile bildirir.

Örnekleme çok iyi,
WWW
Cevapla
#7
(10-03-2018, Saat: 17:54)mrmarman Adlı Kullanıcıdan Alıntı: Programdan çıkışta tüm bu alanı iade etmeniz laxım.

Bu ifadeyi biraz değiştirelim mi? Programdan çıkışta biz iade etmesek bile zaten işletim sistemi geri alır. Bizim iade etmemiz gereken zaman o bellek alanı ile işimiz bittiği zaman olmalı. Yanlışım var ise düzeltiniz lütfen.
Cevapla
#8
Merhaba.

Düzeltme demeyeyim de önce bir durum tespiti ile bu veri ışığında konuşayım. Yoksa işletme sahibi zaten geri alıyorsa neden MemoryLeak konuşuyoruz sorusu devreye giriyor. Smile

Ayrıca başlığı okuyanlar anlatmak istediğim konulara odaklansın, fahiş hatalar dışında cümle içinden cımbızla çekip yorum yapmaktan itina edelim. Başka forum başlıklarında örneklerini gördüm üzmeyin beni.  Smile  

Burada yazacaklarımın altyapısı derya deniz. Yani Windows şunu şöyle yapıyor derken makro seviyede anlatıyorum. 

(1) Delphi dili tarafında delphi paketinde bulunan yapı; bir VCL veya CLASS create ederek oluşturduk ve nihayetinde free ettiğinde Delphi aslında DESTRUCTOR kısmında ( genele yayarak bahsediyorum, istisnalar dışında ) bir free ve nil mekanizması otomatikman yer alır.

Yani programdan çıktığında işyeri sahibi değil de müşterinin kahyası diyelim aslında bir nevi Delphi bunu yapıyor. Ancak nasıl sonlandırıldığı önemli. Close  (takip eden işlemler)  Terminate(process) vb.

(2) Bir de yazılımcının olası tercihi Halt komutu ile sonlandırıldığını düşünün kaynakların iadesinin garantisi yoktur.

Şimdi bu bilgi ışığında zaten işletme sahibi kendisi geri alıyor garantimiz olsaydı, neyi nasıl geri alacak sorusu karşımıza çıkıyor. ( Müşteri : ŞEKERİM DÜŞTÜ. Direkt beni acile götürün dedi ve çıktı Smile  )

Dolayısıyla eğer işletme sahibini bunu hakkıyla yapabiliyor olsaydı bugün Memory Leak konuşuyor olmazdık.

(*) İade dedik ya onun üzerinden konuşalım; Memory Leak sorunu için programın kapanmasına da gerek yoktur. Program çalışırken de rezerve ettiğin alan şişebilmektedir. 

- Yani her create ettiğin nesne bir alan alacak, free / nil konuları konuşuldu daha önce, bu şekilde de bu alan iade edilecektir. Ama sen 1000 kayıtlı bir işlemde döngü içerisinde  bir CREATE Class yapar ama döngüden çıkınca FREE yaparsan elinde 1000 - 1 = 999 tane daha alanı bu yanlış kurgudan dolayı hafızada bırakırsın. 

Programdan çıkılmadığı sürece de bu durum sistem kararsızlaşıncaya kadar sürecektir. Yani sadece programdan geriye kalan kalıntı rezerve alan değil, çalışma esnasında da bu kalıntı şişebilir.

(*) Class/VCL Create edilirken := Create(nil)'ler kullanılıyorsa owneri olmayan sınıf ile ne yapsın garip kahyamız delphi
(*) Programda çok fazla pointer kullanımı varsa -ki performans için olması da lazım- bu erişilen alanların sizden başka kimse tarafında direkt denetimi yoktur. 
(*) Anonim threadler vs. konusuna hiç girmiyorum bile. (hani postmessage ile değişken transferi vb. durumlardan bahis)

Yazının özeti, iyi bir yapı oluşturmak demek "aslan yattığı yerden belli olur" mantığıyla işi bitince kullanılan hafıza bloğunu temizlikten geçer. Bugünün işini yarına bırakmıyor, performans gözeterek işi biteni free - nil - unassigned ne lazımda yapıyoruz.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi