J2ObjC Bellek Modeli

Bu belgede, belleğin J2ObjC çevrilmiş kodu altında nasıl yönetildiği ve programların paylaşılan belleğe erişirken nasıl davrandığı açıklanmaktadır.

Bellek Yönetimi

J2ObjC'nin hedeflerinden biri, Objective-C'nin referans sayma ortamına sorunsuz bir şekilde entegre edilecek çevrilmiş kod oluşturmaktır. Bu, Java ve Objective-C ortamları arasında aktarılan nesneler için tuhaf bir sahiplik aktarımı olmadığından yerel olarak yazılan Objective-C'den çevrilmiş Java kodunun kolayca kullanılmasını sağlar.

Java, bellek yönetimi için atık toplamayı kullandığından, Java kodu nesnelerinin açık bellek yönetimini içermez. Bu nedenle J2ObjC, nesnelerin doğru zamanda dağıtılması için referans sayma çağrılarını uygun şekilde eklemelidir. Hem etkili hem de pratik olduğunu gördüğümüz aşağıdaki kurallar dizisine karar verdik:

  • Tüm nesneler en az mevcut otomatik sürüm havuzunun süresi boyunca aktif olacaktır.
    • Bu genel kural, normalde gerekli olacak birçok saklamayı ve sürümü atlamamıza olanak tanır.
  • Yerel değişkenler saklanmaz.
    • Yerel değişkenlerin okuma veya yazma işlemlerinde referans sayma çağrıları yapılmaz.
  • Alanlar korunur.
    • Alan çağrılarının atanması yeni değeri korur ve eski değer otomatik olarak yayınlanır.
  • Yeni nesneler hemen otomatik olarak serbest bırakılır. (bir alana hemen atanmadığı sürece)

Referans Döngüler

Bir nesne, alanları üzerinden doğrudan veya dolaylı olarak kendisine başvurduğunda bir referans döngüsü ortaya çıkar. Referans döngüleri, Java'nın çöp toplama işlemi tarafından temizlenebilir ancak Objective-C'nin referans sayma ortamında bellek sızıntısına neden olur. Referans döngülerinin oluşmasını engellemenin otomatik bir yolu yoktur ancak döngülerin algılanmasını otomatikleştiren bir Cycle Finder aracı sağlarız. Aşağıda, referans döngüsünü düzeltmenin bazı yaygın yolları verilmiştir:

  • Referanslardan birini zayıflatmak için @Weak veya @WeakOuter ek açıklaması ekleyin.
  • Bazı alanları boş olarak ayarlayan nesnelerden birine cleanup() yöntemi ekleyin. Nesneyi silmeden önce cleanup() numaralı telefonu arayın.
  • Referans döngüsü oluşturmamak için kodu yeniden tasarlamak.

Paylaşılan Bellek

Çok iş parçacıklı bir programda, bazı veriler birden çok iş parçacığı tarafından paylaşılabilir. Java, paylaşılan verilere iş parçacığı güvenli erişim sağlamak için çeşitli araçlar sağlar. Bu bölümde, J2ObjC'nin paylaşılan verilere erişim desteği açıklanmaktadır.

Senkronize edildi

J2ObjC, synchronized anahtar kelimesini doğrudan Hedef-C @synchronized ile eşler.

Atomik

Java, long ve double dışındaki her tür yükleme ve mağaza için atom değerini garanti eder. Bkz. JLS-17.7. volatile alanları haricinde (aşağıda açıklanmıştır) J2ObjC, atom yüklerini ve depolamayı sağlamak için özel bir işlem sunmaz. Bunun anlamı şudur:

  • Tüm iOS platformları 32 veya 64 bit olduğundan, long ve double dışındaki temel türlerin yüklemeleri ve depoları 32 bit cihazlarda atomik, 64 bit sistemlerde ise atomiktir.
  • Nesne türlerinin yükleri ve depoları J2ObjC'de atomik değildir.
    • Referans sayılarını atomik olarak güncellemek çok maliyetli bir işlemdir.
    • Bir nesne alanı, volatile bildirilerek atomik yapılabilir. (aşağıya bakın)

Değişken alanlar

Java, volatile alanlarında hem atomiklik hem de sıralı olarak tutarlı sıralama (JLS-8.3.1.4) sağlar. Bu sıralamalar senkronizasyon için kullanılabilir. J2ObjC, tüm volatile alanları için Java ile aynı garantileri sağlar. J2ObjC, volatile alanları için aşağıdaki mekanizmaları kullanır:

  • Temel türler, c11 atom türleriyle eşlenir.
    • ör. volatile int -> _Atomic(jint)
  • Nesne alanları, pthread mutex kilitleriyle korunur. (önceliğin ters çevrilmesi nedeniyle dönme kilitleri kullanılamaz)
    • Karşılıklı hariç tutma, referans sayımıyla yarış koşullarını önlemek için gereklidir.
    • Uygulama, Objective-C atomik özelliklerine çok benzer.

Atom Türleri

Java, java.util.concurrent.atomic paketinde çeşitli atom türleri sağlar. Bunların hepsi J2ObjC'de özel uygulamalarla tam olarak desteklenir.

Nihai alanlar

Java, bir iş parçacığının nesneyi paylaşırken herhangi bir senkronizasyon gerektirmeden nesnenin son alanları için başlatılmış değerleri görmesini garanti eder. (JSL-17.5) Ancak J2ObjC, değişken olmayan nesne türlerinin (yukarıya bakın) atom erişimini desteklemediğinden, senkronizasyon olmadan bir nesneyi paylaşmanın güvenli bir yolu yoktur. Bu nedenle, son alanlar için gerekli bellek sınırları çıkarılarak J2ObjC kullanıcısına ek kısıtlamalar yerleştirilmez.