Mobil platformlar neden çöp toplama işlemini desteklemiyor?


11

Hem Windows Phone / Xbox hem de Android, nesil çöp toplama desteğinden yoksundur. Bu, birçok programcı için sinir bozucu. Bunun meşru bir mühendislik nedeni var gibi görünüyor, ama anlayamıyorum.

Mevcut telefonlar, 2001'de nesil GC ile .NET 1.1 çalıştıran masaüstü / dizüstü bilgisayarlardan daha fazla bellek ve muhtemelen daha iyi CPU'lara sahiptir ve ARM işlemcilerinin nesil GC'de x86'dan daha kötü olmasının nedenlerini düşünemiyorum. Telefonlarda ve konsollarda çoklu görevlere daha az ihtiyaç vardır, bu nedenle nispeten daha fazla yığın alanı vardır.

Öyleyse ne veriyor?

Düzenleme: Açıklığa kavuşturulması gereken birkaç nokta:

  • Bu platformlar yalnızca uygulamalar için çöp toplama kullanır, bu yüzden sorum GC'nin neden desteklenmediğiyle ilgili değildir; sorum, kuşak çöp toplamalarının neden olmadığı ile ilgili.
  • İnsanların nesilsel GC eksikliğinden rahatsız olmasının nedeni, nesil dışı GC'nin son derece verimsiz olmasıdır. (Bu pil ömrünün nedeni olmadığı anlamına gelir.)
  • Yeni nesil GC desteğinin bulunmamasının dürüst bir teknik nedeni olduğuna inanıyorum. Bu retorik bir soru değil.

Windows Phone'da (şu anki nesil) çöp toplama var. Yalnızca aygıtın belleği yetersiz olduğunda çalışır msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires

@TomSquires WP7'deki GC, aslında her 1MB tahsisatında bir kez çalışır. Sanırım eski süreçleri karakterize eden görev yöneticisi hakkında düşünüyor olabilirsiniz.
Rei Miyasaka

Yanıtlar:


5

Bence en büyük sorun pil ömrü. Çöp toplama, kullanıcının bilgisayarındaki ek CPU döngüleri fiyatından satın alınan geliştirici kolaylığıdır . CPU'nuz takılıyken (masaüstü) veya nispeten büyük bir pile (dizüstü bilgisayar) sahip olduğunda, kullanıcılarınız çöp toplama işlemi yaparken CPU tarafından tüketilen ek enerji ile geliştiricilerin rahatlığını ödemek için daha istekli olurlar. Pil nispeten küçük olduğunda, kullanıcılar bu kadar cömert olmayabilir. Bu ek çubuğu kendileri için isteyebilirler - belki de arkadaşlarıyla konuşmak veya kızgın kuşlar ile ölümcül bir karşılaşmada birkaç ekstra domuz öldürmek.

Kullanıcıların nedenleri ne olursa olsun, OS geliştiricileri, işletim sistemlerini çalıştıran cihazların pilini, rakiplerinin işletim sistemini çalıştıranlardan daha hızlı tükettiği algısı oluşturmak istemezler . Böylece, cihazlarının beklenen pil ömrü süresini geliştiricilerin rahatlığıyla daha iyi algılıyorlar: kullanıcılar için cihazlardan memnun olduğu sürece, ağrınız büyük bir sorun değil.


3
Nesil GC çoğu durumda çok daha verimlidir, bu nedenle saat döngülerinin sayısını azaltacağını düşünürsünüz. Ayrıca Xbox gibi bir şeyin neden nesil GC'sine sahip olmadığını açıklamıyor, çünkü Xbox'lar takılı.
Rei Miyasaka

Eh, öyle duydum var Yığın taşması. Gerçi XBox-es hakkında pek bir şey bilmiyorum.
dasblinkenlight

3
Bu hala soruya cevap vermiyor. Çöp toplama, açık ayırmadan daha fazla güç kullansa bile (ki bu oldukça tartışmalıdır - ve içine girmeyeceğim), soru, açık ayırmanın mobil cihazdaki GC'den daha iyi olup olmadığı / neden olmasa bile, nesil GC mobilde nesil GC'den daha iyidir.
Rei Miyasaka

1
@Rei: Oyunlar tipik olarak her şeyin deterministik olmasını gerektirir; en azından öngörülebilir performansa ihtiyaçları var. Burada birkaç nanosaniye israf edildi ve orada birkaç nanosaniye israf - öngörülemeyen zamanlarda - bir oyun deneyimini mahvedebilir. Nesil çöp toplayıcıları tahmin edilemez.
Karınca

2
@djacobson Bunun doğru olduğunu düşünmüyorum. Söylediğim gibi, sadece Microsoft'un nesil GC'yi ihmal eden platformları olsaydı, muhtemelen sadece lojistik / bürokratik bir sebep olurdu ve sormaya zahmet etmem. Ancak Android de aynı sorunu yaşıyor, bu yüzden muhtemelen teknik bir sebep, yani P.SE'deki birisinin kesin bir cevabı olabilir.
Rei Miyasaka

3

En iyi tahminim, bunun teknik bir neden olmadığı, ancak bu telefon platformları için geliştiricilerin henüz çaba göstermediği yönündeydi. Bunun umduğunuz cevap olmadığını biliyorum, ancak herhangi bir mobil geliştirme yaptıysanız, muhtemelen çok düşük asılı meyvenin olduğunu fark ettiniz . Muhtemelen birden fazla GC uygulaması yazmak, hepsine ince ayar yapmak ve en iyisini yapanı seçmek için zamanları olmadı. Neden herkes yeni, gösterişli, kötü düşünülmüş API'leri yayınlayabildiğinde tekerleği yeniden keşfetmek için zaman harcayacaktır? ;)

FWIW, ve benim teorinin onayı olarak, Android'in yeni çalışma zamanı (ART) gelmez bir kuşak GC var ve hiçbir görsel gelecekte bir sıkıştırma GC olması planlama .


2

Kuşak çöplerinin toplanmasının ek bir maliyeti vardır.

Nesil toplayıcının eski nesnelerin yeni nesnelere ne zaman işaret ettiğini öğrenmesi gerekir. Bu vakaları bulmak için eski nesneyi izleyemeyiz çünkü bu nesiller boyu toplanma amacını bozar. Bunun yerine, bir şekilde bunun ne zaman gerçekleştiğini tespit etmeli ve toplama aşaması için not almalıyız. Bunu nasıl yapacağınızdan bağımsız olarak, toplama sürecine biraz ek yük getirecektir.

Bir masaüstü sisteminde, işletim sisteminiz, perde arkasında bellek ile her türlü şeyi özenle yapıyor. İşlemler arasında sayfa paylaşma, kullanılmayan sayfaları diske yazma, işlemler arasında bellek eşleme sağlama vb. Özellikleri destekler. Anladığım kadarıyla, burada kullanılan bazı işlevler, işaretçilerin değiştirilmesinin daha verimli bir şekilde izlenmesini mümkün kılıyor. İşlem zaten bellekte neleri değiştirdiğiniz konusunda endişeleniyor, bu nedenle bu bilgileri yeni amaçlarla kullanmak sorun değil.

Mobil sistemlerin perde arkasında aynı şeyleri yapmadığından şüpheleniyorum. Sonuç olarak, bir masaüstünün sahip olduğu bilgi düzeyine sahip değildirler. Sonuç olarak, genel bir koleksiyonun uygulanmasına ilişkin genel masraf daha yüksektir ve buna değme olasılığı daha düşüktür.


GC nesillerinin maksimum avantajından yararlanmak, eski nesil nesnelerin ne zaman yazıldığını tespit etmek için yazma çitlerinin kullanılmasını gerektirir. Öte yandan, GC'nin "mark" kısmı nesillerden faydalanmasa bile, birinin sadece yeni nesillerdeki şeyleri hareket ettirerek performansı geliştirebileceğini düşünürdüm (aslında, eski nesillerdeki "tag" aşamasını her nesilde ne kadar geri kazanılabilir bellek olduğunu bilmesine izin verirse daha yenisi yararlı olabilir).
supercat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.