Mengapa platform seluler tidak mendukung pengumpulan sampah generasi?


11

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.

Windows phone (generasi sekarang) memang memiliki pengumpulan sampah. Ini hanya berjalan ketika perangkat kehabisan memori msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires

@ TomSquires GC pada WP7 berjalan setiap alokasi 1MB, sebenarnya. Saya pikir Anda mungkin berpikir tentang manajer tugas proses lama kerning.
Rei Miyasaka

Jawaban:


5

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.


3
GC Generasi jauh lebih efisien dalam banyak kasus, jadi Anda akan berpikir bahwa itu akan mengurangi jumlah siklus clock. Itu juga tidak menjelaskan mengapa sesuatu seperti Xbox tidak memiliki GC generasi, karena Xbox terpasang.
Rei Miyasaka

Nah, itulah yang saya dengar di Stack Overflow. Saya tidak tahu banyak tentang XBox-es.
dasblinkenlight

3
Itu masih belum menjawab pertanyaan. Bahkan jika pengumpulan sampah menggunakan lebih banyak kekuatan daripada alokasi eksplisit (yang sangat bisa diperdebatkan - dan saya tidak akan membahasnya), pertanyaannya bukan apakah / mengapa alokasi eksplisit lebih baik daripada GC di ponsel, itu jika / mengapa tidak GC generasi lebih baik dari GC generasi di ponsel.
Rei Miyasaka

1
@Rei: Game biasanya mengharuskan semuanya untuk deterministik; setidaknya, mereka membutuhkan kinerja yang dapat diprediksi. Beberapa nanodetik terbuang di sini dan beberapa nanodetik terbuang di sana - pada waktu yang tidak terduga - dapat mengacaukan pengalaman gim. Pengumpul sampah generasi tidak dapat diprediksi.
Semut

2
@ Djobobson Saya tidak berpikir itu benar. Seperti yang saya katakan dalam pertanyaan, jika itu hanya platform Microsoft yang mengabaikan GC generasi, maka itu mungkin hanya alasan logistik / birokrasi, dan saya tidak akan repot bertanya. Tetapi Android juga mengalami masalah yang sama, jadi kemungkinan alasan teknis, yang berarti bahwa seseorang di P.SE mungkin memiliki jawaban yang pasti.
Rei Miyasaka

3

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 .


2

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.


Mengambil keuntungan maksimal dari generasi GC membutuhkan penggunaan pagar tulis untuk mendeteksi kapan objek generasi yang lebih tua ditulis. Di sisi lain, bahkan jika bagian "tanda" dari GC tidak dapat mengambil manfaat dari generasi, saya akan berpikir seseorang masih dapat meningkatkan kinerja dengan hanya memindahkan barang-barang di generasi yang lebih baru (sebenarnya, melakukan fase "tag" pada generasi yang lebih tua sebagai dan juga yang lebih baru dapat berguna jika memungkinkan seseorang untuk mengetahui berapa banyak memori yang dapat direklamasi yang ada di setiap generasi).
supercat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.