Baik Windows Phone / Xbox dan Android tidak memiliki dukungan untuk pengumpulan sampah generasi. Ini membuat frustasi banyak programmer. Sepertinya ada alasan teknis yang sah untuk itu, tapi saya tidak bisa mengetahuinya.
Ponsel saat ini memiliki lebih banyak memori dan CPU mungkin lebih baik daripada desktop / laptop yang menjalankan .NET 1.1 dengan generasi GC kembali pada tahun 2001, dan saya tidak bisa memikirkan alasan mengapa prosesor ARM akan lebih buruk di GC generasi daripada x86. Juga ada sedikit kebutuhan untuk melakukan banyak tugas di ponsel dan konsol, jadi ada ruang tumpukan yang relatif lebih bebas.
Jadi apa yang menyebabkannya?
Sunting: Beberapa poin untuk diklarifikasi:
- Platform ini menggunakan pengumpulan sampah untuk aplikasi secara eksklusif, jadi pertanyaan saya bukan tentang mengapa GC tidak didukung; pertanyaan saya adalah mengapa pengumpulan sampah generasi tidak.
- Alasan orang frustrasi tentang kurangnya GC generasi adalah karena GC non-genetika sangat tidak efisien. (Itu berarti masa pakai baterai bukan alasannya.)
- Saya percaya bahwa ada alasan teknis yang jujur tentang kurangnya dukungan GC generasi. Ini bukan pertanyaan retoris.
java
.net
android
windows-phone-7
garbage-collection
Rei Miyasaka
sumber
sumber
Jawaban:
Saya pikir masalah terbesar adalah masa pakai baterai. Pengumpulan sampah adalah kenyamanan pengembang yang dibeli dengan harga siklus CPU tambahan di komputer pengguna . Ketika CPU Anda terhubung ke (desktop) atau memiliki baterai (laptop) yang relatif besar, pengguna Anda lebih bersedia membayar untuk kenyamanan pengembang dengan energi tambahan yang dikonsumsi oleh CPU saat melakukan pengumpulan sampah. Ketika baterai relatif kecil, pengguna mungkin tidak begitu murah hati. Mereka mungkin menginginkan bar tambahan untuk diri mereka sendiri - mungkin untuk berbicara dengan teman-teman mereka, atau untuk membunuh beberapa babi tambahan dalam pertemuan mematikan dengan burung-burung yang marah.
Tidak peduli apa alasan pengguna, pengembang OS tidak ingin membentuk persepsi bahwa perangkat yang menjalankan OS mereka menguras baterai lebih cepat daripada yang menjalankan OS pesaing mereka. Jadi mereka membeli persepsi yang lebih baik tentang waktu masa pakai baterai perangkat mereka dengan harga kenyamanan pengembang: bagi mereka, rasa sakit Anda bukan masalah besar, selama pengguna senang dengan perangkat tersebut.
sumber
Dugaan terbaik saya adalah bahwa itu bukan alasan teknis, tetapi bahwa pengembang untuk platform telepon itu belum berusaha. Saya tahu itu bukan jawaban yang Anda harapkan, tetapi jika Anda telah melakukan pengembangan ponsel apa pun, Anda mungkin memperhatikan ada banyak buah-buahan yang menggantung rendah. Mereka mungkin tidak punya waktu untuk menulis beberapa implementasi GC, menyempurnakan semuanya, dan memilih yang terbaik. Mengapa ada orang yang menghabiskan waktu untuk menciptakan kembali roda padahal mereka malah bisa merilis API baru, mencolok, dan tidak dipikirkan dengan baik? ;)
FWIW, dan sebagai konfirmasi teori saya, runtime baru Android (ART) memang memiliki GC generasi dan mereka berencana untuk memiliki GC pemadatan di masa depan .
sumber
Ada beberapa biaya tambahan untuk pengumpulan sampah generasi.
Kolektor generasi harus dapat mengetahui kapan objek yang lebih tua menunjuk ke objek yang lebih baru. Kami tidak dapat menelusuri objek yang lebih tua untuk menemukan kasus ini karena itu akan mengalahkan tujuan pengumpulan generasi. Sebagai gantinya, kita perlu mendeteksi kapan hal ini terjadi dan mencatatnya untuk tahap pengumpulan. Terlepas dari bagaimana Anda akan melakukannya, itu akan menambah beberapa biaya tambahan untuk proses pengumpulan.
Pada sistem desktop, sistem operasi Anda sibuk melakukan semua hal dengan memori di belakang layar. Ini mendukung fitur seperti berbagi halaman antar proses, menulis halaman yang tidak digunakan ke disk, menyediakan pemetaan memori antar proses, dll. Pemahaman saya adalah bahwa beberapa fungsi yang digunakan di sana memungkinkan untuk lebih efisien melacak pointer yang sedang diubah. Operasi sudah mengkhawatirkan apa yang Anda ubah dalam memori, jadi menggunakan informasi itu untuk tujuan baru bukanlah masalah.
Saya menduga bahwa sistem seluler tidak melakukan semua hal yang sama di belakang layar. Akibatnya, mereka tidak memiliki tingkat informasi yang sama dengan desktop. Karena itu, overhead yang terlibat dalam penerapan koleksi umum lebih tinggi dan kecil kemungkinannya untuk sepadan.
sumber