AFAIK, JVM belirtimi (İngilizce olarak yazılmıştır), bir nesnenin (veya bir değerin) ne zaman tam olarak silinmesi gerektiğinden bahsetmez ve bunu uygulamaya ( R5RS için de ) bırakır . Bir şekilde bir çöp toplayıcıyı gerektirir veya önerir ancak detayları uygulamaya bırakmaktadır. Ve aynı şekilde Java özelliği için.
Unutmayın programlama dilleri olan özellikler (bir sözdizimi , semantik , değil yazılım uygulamaları, vb ...). Java (veya JVM) gibi bir dilin birçok uygulaması vardır. Özelliği yayınlanabilir , indirilebilir (böylece çalışabilirsiniz) ve İngilizce olarak yazılır. §2.3.3 JVM şartnamelerinin bir kısmı bir çöp toplayıcısından bahseder:
Nesneler için yığın depolama, otomatik bir depolama yönetim sistemi (çöp toplayıcı olarak bilinir) tarafından geri kazanılır; nesneler asla açıkça tahsil edilmez. Java Sanal Makinesi, belirli bir otomatik depolama yönetim sistemi türü olmadığını varsaymaktadır.
(vurgu benimdir; BTW sonlandırması, Java'nın §12.6'sında ve bir bellek modelinin, Java'nın §17.4'ünde belirtilmiştir)
Bu yüzden, (Java'da) bir nesnenin ne zaman silineceğini umursamamanız ve ( eğer görmezden geldiğiniz bir soyutlamayı düşünerek) gerçekleşmiyormuş gibi kodlayabilmeniz gerekir . Elbette farklı bir soru olan hafıza tüketimini ve canlı nesneler kümesini önemsemelisin . Bazı basit durumlarda ("merhaba dünyası" programını düşünün), kendinizi tahsis edebileceğinizi veya tahsis edilen hafızanın oldukça küçük (örneğin bir gigabayttan daha az) olduğuna ikna edebileceğinizi kanıtlayabilirsiniz. tek tek nesnelerin silinmesi . Daha fazla durumda, kendinizi yaşayan nesnelerin olduğuna ikna edebilirsiniz.(ya da ulaşılabilir olanlar, yaşayanlar hakkında mantıklı olan bir süperset) asla makul bir sınırı aşmazlar (ve daha sonra GC'ye güvenirsiniz, ancak çöp toplamanın nasıl ve ne zaman olacağını umursamazsınız). Uzay karmaşıklığı hakkında okuyun .
Merhaba dünya gibi kısa ömürlü bir Java programını çalıştıran birkaç JVM uygulamasında, çöp toplayıcı hiç tetiklenmiyor ve silme gerçekleşmiyor. AFAIU, böyle bir davranışın sayısız Java spesifikasyonuna uyuyor.
Çoğu JVM uygulaması kuşak kopyalama tekniklerini kullanır (en azından çoğu Java nesnesi için, sonlandırmayı veya zayıf referansları kullanmayanları ; sonlandırmanın kısa sürede gerçekleşmesi garanti edilmez ve ertelenebilir, bu nedenle kodunuzun yazmaması gereken yararlı bir özelliktir). Tek bir nesneyi silme nosyonunun bir anlam ifade etmemesine bağlıdır (çünkü birçok nesne için büyük miktarda bellek içeren bellek bölgeleri - belki de birkaç megabayt bir kerede serbest bırakılır).
Eğer JVM spesifikasyonu her bir nesnenin mümkün olan en kısa sürede silinmesini gerektiriyorsa (veya sadece nesne silme konusunda daha fazla kısıtlama koyarsa), verimli nesil GC teknikleri yasaklanmış olacak ve Java ile JVM tasarımcıları bundan kaçınmakta akıllıca olacaktır.
BTW, nesneleri silmeyen ve belleği serbest bırakmayan saf bir JVM'nin teknik özelliklere uygun olması (mektubu, ruhu değil) ve kesinlikle merhaba dünyası bir şeyi pratikte yürütmesi mümkün olabilir (en çok küçük ve kısa ömürlü Java programları muhtemelen birkaç gigabayttan fazla bellek ayırmaz). Elbette böyle bir JVM, bahsetmeye değmez ve sadece oyuncak bir şeydir ( C'nin bu uygulaması gibi malloc
). Daha fazla bilgi için Epsilon NoOp GC'ye bakınız . Gerçek hayattaki JVM'ler çok karmaşık yazılım parçalarıdır ve çok sayıda çöp toplama tekniğini karıştırır.
Ayrıca, Java , JVM ile aynı değildir ve JVM olmadan çalışan Java uygulamalarınız vardır (örneğin, önceden belirlenmiş Java derleyicileri, Android çalışma zamanı ). Gelen bazı durumlarda (çoğunlukla akademik olanlar), size çünkü bir Java programı tahsis veya çalışma (örneğin en silmeyin ki (böylece "derleme zamanı çöp toplama" teknikleri denir) hayal olabilir optimizasyon derleyicisi sadece kullanmak için yeterince zeki olmuş çağrı yığını ve otomatik değişkenler ).
Java nesneleri neden artık başvuruda bulunulduktan hemen sonra silinmiyor?
Çünkü Java ve JVM özellikleri buna ihtiyaç duymuyor.
Daha fazla bilgi için GC el kitabını okuyun (ve JVM spec ). Bir nesne için hayatta (ya da gelecekteki hesaplamalar için yararlı) olmanın bir tüm program (modüler olmayan) özellik olduğuna dikkat edin.
Objective-C hafıza yönetimine referans sayma yaklaşımını tercih eder . Ve bunun ayrıca tuzakları vardır (örneğin, Objective-C programcısı zayıf referansları açıklayarak dairesel referansları dikkate almak zorundadır , ancak bir JVM, dairesel referansları Java programlayıcısına dikkat etmeksizin pratikte güzel bir şekilde ele alır).
Orada hiçbir Silver Bullet (farkında programlama ve programlama dili tasarımında Durma Problemi ; yararlı bir yaşam nesnesi olma olduğu undecidable genel olarak).
Ayrıca SICP , Programlama Dili Pragmatik , Ejderha Kitap , Küçük Parçalar ve İşletim Sistemlerinde Lisp : Üç Kolay Parça da okuyabilirsiniz . Java ile ilgili değillerdir, ancak fikrinizi açacaklar ve bir JVM'nin ne yapması gerektiğini ve pratik olarak (diğer parçalarla) bilgisayarınızda nasıl çalışabileceğini anlamalarına yardımcı olacaktır. Ayrıca, mevcut açık kaynaklı JVM uygulamalarının karmaşık kaynak kodunu ( birkaç milyon kaynak kod satırına sahip olan OpenJDK gibi ) çalışmak için aylarca (ya da birkaç yıl) harcayabilirsiniz .