Java-da Yaddaş İdarəsi

Java proqramlaşdırma dili, yaddaş idarəetməsinin avtomatik şəkildə həyata keçirildiyi bir platforma təmin edir. Bu xüsusiyyət sayəsində, proqramçılar yaddaşın paylanması və sərbəst buraxılması kimi məsələlərdə birbaşa iştirak etmirlər. Bununla belə, yaddaş idarəetməsinin əsaslarını başa düşmək və bu prosesi effektiv şəkildə idarə etmək, yüksək performanslı və səmərəli proqramların hazırlanması üçün vacibdir.

20 Avqust 2024 - 10:56
 0  158
Java-da Yaddaş İdarəsi
Java Azərbaycan

Yaddaş İdarəetməsinin Komponentləri

Java yaddaş idarəetməsi JVM (Java Virtual Machine) tərəfindən həyata keçirilir və bu proses əsasən iki yaddaş sahəsini əhatə edir: Heap Stack.

  1. Heap Yaddaşı:

    • Heap yaddaşı JVM-dəki bütün obyektlərin saxlanıldığı yer kimi xidmət edir. Java-da hər bir yeni obyekt new açar sözü ilə yaradıldıqda, bu obyekt Heap yaddaşında yerləşdirilir.
    • Heap yaddaşı bir neçə nəsil (generations) üzrə təşkil olunur:
      • Young Generation (Gənc Nəsil): Yeni yaradılan obyektlər əvvəlcə Young Generation-da yerləşdirilir. Bu nəsil də öz növbəsində Eden SpaceSurvivor Spaces (S0, S1) olmaqla üç alt sahəyə bölünür.
      • Old Generation (Köhnə Nəsil): Gənc Nəsildə uzun müddət qalan və sağ qalan obyektlər, yaşlanaraq Old Generation-a keçir. Bu sahə daha sabit obyektləri saxlayır.
      • Permanent Generation (PermGen): Java 7 və əvvəlki versiyalarda, JVM tərəfindən istifadə olunan metadata (məlumatlar) burada saxlanılır. Java 8-dən sonra isə bu sahə "Metaspace" adlandırılıb və Heap yaddaşının bir hissəsi deyil.
  2. Stack Yaddaşı:

    • Stack yaddaşı metod çağırışları və lokal dəyişənlər üçün istifadə olunur. Hər bir metod çağırışı üçün ayrı bir Stack frame yaradılır və metod başa çatdıqda həmin frame avtomatik olaraq sərbəst buraxılır.
    • Stack yaddaşı sabit ölçüyə malikdir və hər bir thread üçün ayrıca Stack yaradılır. Bu yaddaş sahəsi StackOverflowError səhvinə səbəb ola biləcək qədər dolarsa, proqram dayandırıla bilər.

Garbage Collection (Zibil Toplama)

Java-nın yaddaş idarəetməsində ən əhəmiyyətli rol oynayan mexanizmlərdən biri Garbage Collection (GC) prosesidir. Bu proses, proqramın artıq istifadə etmədiyi obyektləri müəyyən edir və onların istifadə etdiyi yaddaşı sərbəst buraxır. Java-da GC avtomatik olaraq işləyir, lakin JVM performansını artırmaq üçün fərqli GC alqoritmləri təklif edir:

  1. Serial Garbage Collector:

    • Kiçik tətbiqlər üçün nəzərdə tutulub və bir thread ilə işləyir.
    • Sadə və yüngül olsa da, GC prosesini həyata keçirərkən proqramın qalan hissəsi dayanır.
  2. Parallel Garbage Collector (Throughput Collector):

    • Bir neçə thread istifadə edərək, GC prosesini paralel şəkildə həyata keçirir.
    • Böyük tətbiqlər üçün nəzərdə tutulub və daha sürətli GC prosesi təmin edir.
  3. CMS (Concurrent Mark-Sweep) Garbage Collector:

    • Bu GC, obyektlərin işarələnməsi (marking) və silinməsi (sweeping) prosesini paralel şəkildə həyata keçirir.
    • Daha az gecikmə ilə çalışır və interaktiv tətbiqlər üçün uyğundur.
  4. G1 Garbage Collector:

    • Java 7 və sonrakı versiyalarda təqdim edilən G1, böyük Heap yaddaşı olan sistemlər üçün nəzərdə tutulub.
    • Heap yaddaşını müxtəlif regionlara bölür və bu regionlar üzərində paralel şəkildə GC əməliyyatlarını həyata keçirir.

Yaddaş Sızmaları və Səbəbləri

Yaddaş sızması (Memory Leak), Java-da qarşılaşa biləcəyiniz potensial problemlərdən biridir. Bu, bir obyektin hələ də əlçatan olduğu, lakin proqram tərəfindən istifadəsiz qaldığı vəziyyətlərdə baş verir. Garbage Collector bu obyektləri hələ də "əlçatan" olaraq tanıdığı üçün onları sərbəst buraxmır, nəticədə bu obyektlər yaddaşda yer tutur və proqramın yaddaş resursları tükənir.

Yaddaş sızmasının bəzi ümumi səbəbləri:

  • Statik Referanslar: Statik dəyişənlər uzun müddət yaddaşda saxlanıldığı üçün bu obyektlər Heap yaddaşında qalır və sərbəst buraxılmır.
  • Unudulmuş Dəyərlər: Bir obyekt hələ də referans edilirsə, lakin artıq lazım deyilsə, bu obyekt yaddaşda saxlanılır.
  • Əlçatmaz Kodlar (Dangling References): Obyektlərin referanslarının itirilməsi, lakin hələ də Heap yaddaşında qalması.

Yaddaş İdarəetməsinin Optimizasiyası

Java yaddaş idarəetməsinin optimizasiyası, performans və səmərəlilik baxımından böyük əhəmiyyət kəsb edir. Bu məqsədlə bəzi əsas strategiyalara diqqət yetirmək lazımdır:

  1. Yaddaşın Profilinqi:

    • JVM profiling alətləri (məsələn, VisualVM, JProfiler) istifadə edərək, tətbiqin yaddaş istifadəsini analiz etmək və yaddaş sızmalarını aşkar etmək mümkündür.
  2. Obyektlərin Yenidən İstifadəsi:

    • Obyektlərin yenidən istifadəsi, məsələn, obyekt hovuzlarının (object pools) yaradılması, Heap yaddaşının səmərəli istifadəsinə kömək edir.
  3. Kolleksiyaların Düzgün İstifadəsi:

    • Kolleksiya obyektləri böyük həcmdə yaddaş istifadə edə bilər. Məsələn, ArrayList və ya HashMap kimi kolleksiyalarda elementləri müntəzəm olaraq təmizləmək, yaddaş istifadəsini optimallaşdırır.
  4. WeakReference və SoftReference:

    • Bu siniflər, obyektlərin Garbage Collector tərəfindən daha asan sərbəst buraxılmasına kömək edir, beləliklə yaddaş resurslarının daha effektiv idarə olunmasına şərait yaradır.

Deməli belə, Java yaddaş idarəetməsi, proqramçılar üçün əhəmiyyətli bir mövzu olaraq qalır, çünki yaddaşın effektiv idarə edilməsi tətbiqlərin performansını və stabilliyini birbaşa təsir edir. Garbage Collector avtomatik olaraq işləsə də, proqramçılar yaddaşın istifadəsini optimallaşdırmaq üçün diqqətli olmalı və yaddaş sızmalarından qaçınmaq üçün lazımi addımlar atmalıdırlar. Yaddaşın profilinqi, obyektlərin yenidən istifadəsi və kolleksiyaların səmərəli idarə edilməsi, yaddaş idarəetməsini optimallaşdırmaq üçün əsas strategiyalar arasındadır.