Zəif keçid

Zəif keçidproqramlaşdırmada zəif istinad zibil toplanması və ya istinadların hesablanması ilə sistemlərdə dinamik şəkildə yaradılmış obyektlərə xüsusi istinad növüdür. Güclü istinadlardan onunla fərqlənir ki, zibil toplayıcı silinəcək obyektləri müəyyən edərkən istinadla obyektin əlaqəsini nəzərə almır. Beləliklə, zəif istinad güclü istinad kimi obyektlə işləməyə imkan verir, lakin lazım gələrsə, ona zəif istinad olsa belə, obyekt silinəcəkdir. Adi istinadlar bəzən zibil yığımı kontekstində "güclü" istinadlar adlandırılır.

Konsepsiyanın məzmunu

[redaktə | mənbəni redaktə et]

Zəif istinad anlayışı zibil yığılmasını dəstəkləyən sistemlərdə və proqramlaşdırma dillərində mövcuddur — istifadəsi dayandırılmış və artıq bərpa edilməyəcək obyektlərin yaddaşdan avtomatik çıxarılması. Zibilin toplanmasına məruz qalan obyektləri müəyyən etmək üçün əlçatanlıq alqoritminin bu və ya digər versiyası istifadə olunur — proqramda ən azı bir istinad olduqda obyekt əlçatan sayılır. Proqramda obyektə bir dənə də olsun istinad qalmadıqda, yəni obyektin istifadəsi dayandırıldıqda, belə obyekt növbəti uyğun anda silinə bilər. Yaddaşın boşaldılması üçün təsvir edilən mexanizm bəzi hallarda "unudulmuş" istinadlara görə yaddaş sızması yarada bilər, yaradılmış obyektlərə istinadlar bir neçə yerdə saxlandıqda və obyekt artıq istifadə edilmədikdə proqramçı onların hamısını silmir. Problemlərin qarşısını almaq üçün proqramçı bağlantıların istifadəsində kifayət qədər sərt nizam-intizama riayət etmək məcburiyyətində qalır ki, bu da həmişə əlverişli deyil. Belə problemlərin qarşısını almaq üçün proqramlaşdırma dili və ya mühiti zəif istinadlar adlandırılanları dəstəkləyə bilər. Bu cür istinadlar adi istinadlarla eyni şəkildə istifadə olunur, lakin zibilin yığılmasına təsir göstərmir, çünki arayışların hesablanması mexanizmi tərəfindən nəzərə alınmır və belə istinadların mövcud olduğu obyekt, adi istinadlar olmadığı təqdirdə silinə bilər. o (bu kontekstdə "güclü əlaqələr" adlandırıla bilər).

İcra və istifadə

[redaktə | mənbəni redaktə et]

Zəif istinadlardan istifadə proseduru bütün sistemlərdə prinsipcə eynidir.

1.Zəif istinadın saxlanması tələb olunduqda, hədəf obyektə müntəzəm ("güclü") istinaddan ötürülən istinad obyekti (WeakReference sinfinin nümunəsi) yaradılır. Keçilmiş güclü arayış dərhal buraxılır və onun bir nüsxəsi refererdə zibil kollektorunun müvafiq obyekti silməsinə mane ola bilməyən formada saxlanılır. İstinad edənin özü adi bir obyekt kimi saxlanılır, yəni ona müntəzəm, "güclü" bir keçid saxlanmalıdır.

2.Zəif bir istinad tələb olunduqda, get() metodu (C#-da Hədəf xassəsi) istinadçıya çağırılır, o, əgər obyekt hələ də mövcuddursa, ona güclü istinad yaradır və qaytarır və ya sıfır (sıfır) göstəricisini yaradır. obyekt artıq zibil yığılıb.

3.Əgər istinad edən etibarlı istinad qaytarıbsa, o, obyektə normal şəkildə daxil olmaq üçün istifadə olunur. get() tam güclü istinad qaytardığından, obyekt onun istifadəsi zamanı silinməyəcək. İstifadəsi başa çatdıqda, istinad edənin istinad etdiyi obyekt yenidən zibil toplamaq üçün əlçatan olur. Yəni, refererdən alınan güclü keçid silinibsə, obyektin yeni istifadəsi üçün istinad edəndən yeni bir keçid əldə etmək və onun null göstərici ilə bərabərliyini yoxlamaq lazımdır.

4.Söndürən sıfır göstərici qaytarıbsa, bu o deməkdir ki, obyekt referer zamanı artıq zibil toplayıcı tərəfindən silinib. Proqram kodu bu vəziyyəti tətbiq məntiqinə uyğun olaraq özü həll etməlidir. Məsələn, zəif istinadlar massivi xarici mediada saxlanılan tez-tez əldə edilən məlumatlar üçün keş kimi çıxış edə bilər; sonra obyektin zəif bir keçid ilə əlçatmazlığı onu diskdən və ya DBMS-dən yükləmək və zəruri hallarda keşdəki girişi yeniləmək ehtiyacı deməkdir.[1]

Zəif istinadların istifadə üsulu tapşırıqla müəyyən edilir. Ümumi praktika, yalnız proqram həmin obyektlərdən istifadə etdiyi müddətcə lazım olan obyektlərə zəif istinadları kolleksiyalarda saxlamaqdır. Obyektə artıq ehtiyac qalmadıqda və ona güclü istinadlar silindikdə, kolleksiyada saxlanılan zəif istinadlar obyektin yaddaşdan silinməsinə mane olmur və beləliklə, onların kolleksiyadan açıq şəkildə çıxarılması ehtiyacını aradan qaldırır.[2]

Java-da SoftReference sinfinin bir xüsusiyyəti ondan ibarətdir ki, obyekti silərkən zibil kollektoru bu arayış vasitəsilə ona daxil olma tezliyini nəzərə alır ki, bu da, məsələn, xarici cihazlarda - önbellekdə yerləşən məlumatların keşləşdirilməsini həyata keçirmək üçün faydalı ola bilər. kolleksiya daha tez-tez daxil olan obyektləri avtomatik olaraq daha uzun müddət saxlayır.[3]

Artıq mövcud olmayan obyektlərə zəif istinadların yaddaşı çirkləndirməsinin qarşısını almaq üçün sistem kitabxanaları bu cür istinadları nəzərə almaq üçün mexanizmlər təqdim edir. Bu mexanizmin bir variantı keçid növbələridir - yaradıldıqdan sonra istinadçıya ötürülən xüsusi obyektlər. Zibil kollektoru zəif istinadla istinad edilən obyekti məhv etdikdə, əvvəllər keçmiş istinad növbəsinə müvafiq istinadçıya istinad yerləşdirir. Beləliklə, "ölü" keçidləri ehtiva edən istinadçıların siyahısı proqramda mövcuddur və o, istənilən uyğun anda onları silə bilər.[4][5]

  1. java.lang.ref.WeakReference и java.lang.ref.SoftReference
  2. "Основные конструкции языков Java и C#". 2012-10-29 tarixində arxivləşdirilib. İstifadə tarixi: 2022-07-13.
  3. "Java: управление ресурсами". 2020-02-05 tarixində arxivləşdirilib. İstifadə tarixi: 2022-07-13.
  4. "Теория и практика Java: Устранение утечек памяти посредством слабых ссылок. Статья на сайте IBM". 2016-07-01 tarixində arxivləşdirilib. İstifadə tarixi: 2022-07-13.
  5. "Виды ссылок на объекты в Java". 2021-04-10 tarixində arxivləşdirilib. İstifadə tarixi: 2022-07-13.