CodeGym /Java Blogu /Rastgele /nesne yaşam döngüsü
John Squirrels
Seviye
San Francisco

nesne yaşam döngüsü

grupta yayınlandı
MERHABA! Bilgisayarınızın hafızasının sınırlı olduğunu söylesem pek şaşırmayacağınızı düşünüyorum :)
Nesne yaşam döngüsü - 1
Sabit sürücünüz bile (ki bu RAM'in birçok katı büyüklüğündedir) en sevdiğiniz oyunlar, TV şovları ve diğer şeylerle dolu olabilir. Bunun olmasını önlemek için, bilgisayarınızın belleğinin mevcut durumunu izlemeniz ve gereksiz dosyaları silmeniz gerekir. Tüm bunların Java programlama ile nasıl bir ilişkisi var? Oldukça doğrudan! Sonuçta, herhangi bir nesne oluşturmak, Java makinesinin ona bellek ayırmasına neden olur . Büyük bir gerçek dünya programı, on veya yüzbinlerce nesne oluşturur ve her biri için bir yığın bellek ayrılır. Ama ne düşünüyorsun, bu nesnelerden kaç tane var? Programımız çalışırken onlar "canlı" mı? Tabii ki değil. Tüm avantajlarına rağmen Java nesneleri ölümsüz değildir :) Nesnelerin kendi yaşam döngüleri vardır. Bugün kod yazmaya biraz ara verip bu süreci inceleyeceğiz :) Bir programın nasıl çalıştığını anlamak ve kaynakları yönetmek için de çok önemlidir. Peki bir cismin ömrü nerede başlar? İnsan gibi, doğuştan, yani yaratıldığı andan itibaren.

Cat cat = new Cat();// Our Cat object's lifecycle begins now!
İlk olarak, Java sanal makinesi, nesneyi oluşturmak için gerekli belleği ayırır. catArdından , onu takip etmeyi mümkün kılmak için (bizim durumumuzda, ) ona bir referans oluşturur . Ardından tüm değişkenler başlatılır, yapıcı çağrılır ve yeni nesnemiz artık kendi hayatını yaşıyor :) Nesne ömürleri değişir. Burada kesin rakamlar yok. Her halükarda, bir nesne belirli bir süre programda yaşar ve işlevlerini yerine getirir. Kesin olmak gerekirse, nesne, ona göndermeler olduğu sürece "canlıdır". Referans olmadığı anda nesne "ölür". Örneğin:

public class Car {
  
   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");
       lamborghini = null;

   }

}
Yöntemde main(), "Lamborghini Diablo" Araba nesnesi ikinci satırda canlı olmaktan çıkar. Buna yalnızca bir referans vardı ve referans null olarak ayarlandı. Diablo'ya referans kalmadığından "çöp" olur. Bunun gerçekleşmesi için bir referansın sıfır olarak ayarlanması gerekmez:

public class Car {

   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");

       Car lamborghiniGallardo = new Car("Lamborghini Gallardo");
       lamborghini = lamborghiniGallardo;
   }

}
Burada ikinci bir nesne oluşturduk ve onu lamborghini referansına atadık. Şimdi iki referans nesneye işaret ediyor Lamborghini Gallardo, ancak Lamborghini Diablonesnede hiçbiri yok. Bu, Diablonesnenin çöp haline geldiği anlamına gelir. Bu, Java'nın yerleşik çöp toplayıcısının (GC) devreye girdiği zamandır.
Nesne yaşam döngüsü - 2
Çöp toplayıcı, belleği boşaltmaktan, yani gereksiz nesneleri bellekten kaldırmaktan sorumlu dahili bir Java mekanizmasıdır. Onu bir robot elektrik süpürgesi ile temsil etmeyi seçmemizin bir nedeni var. Çöp toplayıcı yaklaşık olarak aynı şekilde çalışır: arka planda programınız "hareket eder" ve çöpleri toplar. Pratik olarak onunla etkileşime girmek zorunda değilsiniz. Görevi, programda artık kullanılmayan nesneleri silmektir. Böylece, diğer nesneler için belleği boşaltır. Gerçek hayatta söylediğimiz dersin başında bilgisayarınızın durumunu izlemeniz ve eski dosyaları silmeniz gerektiğini hatırlıyor musunuz? Java nesnelerinden bahsediyorsak, çöp toplayıcı bunu sizin için yapar.. Çöp toplayıcı, programınız çalışırken birçok kez başlatılır: onu açıkça çağırmanız ve komutlar vermeniz gerekmez (bu teknik olarak mümkün olsa da). Daha sonra çöp toplayıcı hakkında daha fazla konuşacağız ve nasıl çalıştığını daha ayrıntılı olarak analiz edeceğiz. Çöp toplayıcı bir nesneye ulaştığında -yok edilmeden hemen önce- nesnenin özel finalize()yöntemi çağrılır. Bu yöntem, nesne tarafından kullanılan belirli ek kaynakları serbest bırakmak için çağrılabilir. Yöntem finalize(), Object sınıfına aittir. equals()Başka bir deyişle , hashCode()ve toString()(daha önce tanıştığınız) ile benzerdir . Her nesnede vardır . Diğer yöntemlerden farkı... bunu nasıl söyleyelim... çok kasıtlı. Bununla şunu kastediyoruzbir nesne yok edilmeden önce her zaman çağrılmaz . Programlama çok hassas bir faaliyettir. Programcı bilgisayara bir şey yapmasını söyler ve bilgisayar onu yapar. Bu tür davranışlara alıştığınızı varsayıyorum, bu nedenle ilk başta şu fikri kabul etmeniz zor olabilir: "Bir nesne yok edilmeden önce, Object sınıfının yöntemi çağrılır. Ya da değil. Şansımız yaver giderse finalize()! " Yine de bu gerçek. Java makinesinin kendisi, duruma göre finalize() öğesinin çağrılıp çağrılmayacağına karar verir. Bir deney olarak, aşağıdaki kodu çalıştırmayı deneyelim:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public Cat() {
   }

   public static void main(String[] args) throws Throwable {

       for (int i = 0 ; i < 1000000; i++) {

           Cat cat = new Cat();
           cat = null;// The first object becomes available for garbage collection here
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("The Cat is destroyed!");
   }
}
Bir nesne yaratıyoruz Catve sonraki satırda ona yapılan tek referansı sıfırlıyoruz. Ve bunu milyonlarca kez yapıyoruz. Yöntemi açıkça geçersiz kıldık finalize(). Bir nesne her Catyok edildiğinde, toplam bir milyon kez olmak üzere bir dizi göstermelidir. Ama hayır! Kesin olmak gerekirse, bilgisayarımda yalnızca 37346 kez yürütüldü! Başka bir deyişle, Java makinem finalize()her 27 vakadan sadece 1'inde yöntemi çağırmaya karar verdi. Diğer durumlarda, çöp toplama bu aramayı içermiyordu. Bu kodu kendiniz çalıştırmayı deneyin. Büyük olasılıkla farklı bir sonuç alacaksınız. Gördüğünüz gibi, finalize()güvenilir bir ortak aramak zor :) O halde, gelecek için küçük bir ipucu: Kritik kaynakları serbest bırakma yöntemine güvenmeyin .finalize()JVM onu arayabilir veya aramayabilir. Kim bilir? Nesneniz canlıyken bazı performans açısından kritik kaynaklara (örneğin, açık bir veritabanı bağlantısı) sahipse, nesne artık gerekli olmadığında bunları serbest bırakmak için özel bir yöntem oluşturmak ve açıkça çağırmak daha iyi olur. Bu şekilde, programınızın performansının düşmeyeceğinden emin olacaksınız. Hafıza ile çalışmanın ve çöp toplamanın çok önemli konular olduğunu söyleyerek başladık ve gerçekten de öyleler. Kaynakların yanlış kullanılması ve gereksiz nesnelerin nasıl temizlendiğinin yanlış anlaşılması, en tatsız hatalardan birine yol açabilir: bellek sızıntıları . Bu, en iyi bilinen programlama hatalarından biridir. Hatta kendi Wikipedia makalesi bile var.. Kötü yazılmış kod, belleğin her seferinde yeni oluşturulan nesneler için ayrıldığı, ancak eski, gereksiz nesnelerin çöp toplama için kullanılamadığı bir durum yaratabilir. Robot süpürge benzetmesini zaten yaptığımıza göre, robotu çalıştırmadan önce evin her yerine çorap saçar, cam vazoyu kırar ve yere lego parçaları bırakırsanız ne olacağını hayal edin. Doğal olarak, robot bir şeyler yapmaya çalışacak ama bir gün yakalanacak.
Nesne yaşam döngüsü - 3
Elektrikli süpürgenin düzgün çalışması için zemini iyi durumda tutmanız ve kaldıramayacağı her şeyi toplamanız gerekir. Çöp toplayıcı da aynı prensibi izler. Bir programın temizleyemediği çok sayıda nesne varsa (bir çorap veya robot elektrikli süpürgemiz için Lego gibi), bir gün hafızamız tükenir. Yalnızca programınız askıda kalmaz, bilgisayarda çalışmakta olan diğer tüm programlar da askıda kalır. Ne de olsa onların da yeterli hafızası olmayacak (analojimize dönersek, yerdeki kırık cam sadece elektrikli süpürgeyi değil, evde yaşayan insanları da durdurur). Kısacası, Java'da nesne yaşam döngüsü ve çöp toplama böyle görünür. Bunu ezberlemenize gerek yok: nasıl çalıştığını basitçe anlamanız yeterli. Bir sonraki derste, biz Bu süreçlere daha ayrıntılı olarak döneceğim. Ancak şimdilik CodeGym görevlerini çözmeye dönebilirsiniz :) İyi şanslar!
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION