Model Memori J2ObjC

Dokumen ini menjelaskan bagaimana memori dikelola dalam kode yang diterjemahkan J2ObjC, dan bagaimana perilaku program saat mengakses memori bersama.

Manajemen Memori

Salah satu tujuan J2ObjC adalah menghasilkan kode yang diterjemahkan, yang akan terintegrasi secara lancar dengan lingkungan penghitungan referensi Objective-C. Hal ini membuat kode Java yang diterjemahkan menjadi mudah digunakan dari Objective-C yang ditulis secara native karena tidak ada transfer kepemilikan yang aneh untuk objek yang diteruskan antara lingkungan Java dan Objective-C.

Karena Java menggunakan pembersihan sampah memori untuk pengelolaan memori, kode Java tidak berisi pengelolaan memori eksplisit objeknya. Oleh karena itu, J2ObjC harus menyisipkan panggilan penghitungan referensi dengan tepat untuk memastikan bahwa objek dibatalkan alokasinya pada waktu yang tepat. Kami telah menetapkan serangkaian aturan berikut yang menurut kami berperforma baik dan praktis:

  • Semua objek akan aktif setidaknya selama durasi kumpulan rilis otomatis saat ini.
    • Aturan umum ini memungkinkan kita untuk melewati banyak penyimpanan dan rilis yang seharusnya diperlukan.
  • Variabel lokal tidak dipertahankan.
    • Tidak ada panggilan penghitungan referensi pada pembacaan atau penulisan variabel lokal.
  • Kolom dipertahankan.
    • Penetapan panggilan kolom akan mempertahankan nilai baru dan rilis otomatis pada nilai lama.
  • Objek baru akan segera dirilis secara otomatis. (kecuali segera ditetapkan ke kolom)

Siklus Referensi

Siklus referensi terjadi saat sebuah objek merujuk ke dirinya sendiri, baik secara langsung maupun tidak langsung melalui kolomnya. Siklus referensi dapat dibersihkan dengan pembersihan sampah memori Java, tetapi akan membocorkan memori di lingkungan penghitungan referensi Objective-C. Tidak ada cara otomatis untuk mencegah terjadinya siklus referensi; tetapi, kami menyediakan alat Cycle Finder yang mengotomatiskan deteksi siklus. Berikut beberapa cara umum untuk memperbaiki siklus referensi:

  • Tambahkan anotasi @Weak atau @WeakOuter untuk melemahkan salah satu referensi.
  • Tambahkan metode cleanup() ke salah satu objek yang menetapkan beberapa kolom ke null. Panggil cleanup() sebelum menghapus objek.
  • Mendesain ulang kode untuk menghindari pembuatan siklus referensi sama sekali.

Memori Bersama

Dalam program multi-thread, beberapa data dapat dibagikan oleh beberapa thread. Java menyediakan beberapa alat untuk memungkinkan akses thread aman ke data bersama. Bagian ini menjelaskan dukungan J2ObjC untuk mengakses data bersama.

Disinkronkan

J2ObjC memetakan kata kunci synchronized langsung ke Objective-C @synchronized.

Atomisitas

Java menjamin atomicity untuk pemuatan dan penyimpanan semua jenis kecuali long dan double. Lihat JLS-17.7. Dengan pengecualian kolom volatile (dijelaskan di bawah), J2ObjC tidak memberikan perlakuan khusus untuk memastikan pemuatan dan penyimpanan atomik. Ini menyiratkan hal berikut:

  • Karena semua platform iOS adalah 32 atau 64-bit, pemuatan dan penyimpanan jenis primitif kecuali long dan double bersifat atomik pada perangkat 32-bit, dan semuanya bersifat atomik pada sistem 64-bit.
  • Beban dan penyimpanan jenis objek tidak bersifat atomik di J2ObjC.
    • Memperbarui jumlah referensi secara atom terlalu mahal.
    • Kolom objek dapat dibuat atomik dengan mendeklarasikannya volatile. (lihat di bawah)

Kolom volatil

Untuk kolom volatile, Java menyediakan pengurutan yang konsisten secara berurutan dan atomicity (JLS-8.3.1.4), yang dapat digunakan untuk sinkronisasi. J2ObjC memberikan jaminan yang sama seperti Java untuk semua kolom volatile. J2ObjC menggunakan mekanisme berikut untuk kolom volatile:

  • Jenis primitif dipetakan ke jenis atom c11.
    • Misalnya volatile int -> _Atomic(jint)
  • Kolom objek dilindungi dengan kunci mutex pthread. (tidak dapat menggunakan penguncian rotasi karena inversi prioritas)
    • Pengecualian bersama diperlukan untuk mencegah kondisi race dengan penghitungan referensi.
    • Implementasinya sangat mirip dengan properti atom Objective-C.

Jenis Atom

Java menyediakan sejumlah jenis atom dalam paket java.util.concurrent.atomic. Semuanya didukung sepenuhnya di J2ObjC dengan implementasi kustom.

Kolom akhir

Java menjamin bahwa thread melihat nilai yang diinisialisasi untuk kolom akhir objek tanpa memerlukan sinkronisasi apa pun saat membagikan objek. (JSL-17.5) Namun, karena J2ObjC tidak mendukung akses atomik jenis objek non-volatile (lihat di atas), tidak ada cara yang aman untuk berbagi objek tanpa sinkronisasi. Oleh karena itu, tidak ada batasan tambahan yang ditempatkan pada pengguna J2ObjC dengan menghilangkan memory fence yang diperlukan untuk kolom akhir.