モバイルプラットフォームが世代別ガベージコレクションをサポートしないのはなぜですか?


11

Windows Phone / XboxとAndroidの両方で、世代別ガベージコレクションがサポートされていません。これは多くのプログラマにとってイライラさせられます。それには正当なエンジニアリング上の理由があるように見えますが、私はそれを理解できません。

現在の携帯電話は、2001年に世代別GCを備えた.NET 1.1を実行しているデスクトップ/ラップトップよりも多くのメモリとおそらく優れたCPUを備えています。また、電話やコンソールでのマルチタスクの必要性が少なくなるため、比較的多くの空きヒープスペースがあります。

それで何が得られますか?

編集:明確にするためのいくつかのポイント:

  • これらのプラットフォームはアプリ専用のガベージコレクションを使用するため、私の質問はGCがサポートされない理由ではありません。私の質問は、世代別ガベージコレクションがそうではない理由についてです。
  • 世代別GCの欠如に人々が不満を抱いている理由は、非世代別GCが非常に非効率的だからです。(つまり、バッテリーの寿命が理由ではないことを意味します。)
  • 世代別GCのサポートがないことには、正直な技術的理由があると思います。これは修辞的な質問ではありません。

Windows Phone(現在の世代)にはガベージコレクションがあります。デバイスのメモリが不足している場合にのみ実行されますmsdn.microsoft.com/en-us/library/gg490770.aspx
トムスクワイアーズ

@TomSquires WP7のGCは、実際には1MBの割り当てごとに1回実行されます。古いプロセスをカーニングするタスクマネージャーについて考えているのではないでしょうか。
宮坂

回答:


5

最大の問題はバッテリーの寿命だと思います。ガベージコレクションは、ユーザーのコンピューターで追加のCPUサイクルの代価で購入される開発者の利便性です。CPUが差し込まれている場合(デスクトップ)または比較的大きなバッテリーを搭載している場合(ラップトップ)、ユーザーはガベージコレクションの実行中にCPUによって消費される追加のエネルギーで開発者の利便性を喜んで支払います。バッテリーが比較的小さい場合、ユーザーはそれほど寛大ではないかもしれません。彼らは自分自身のためにその追加のバーを望んでいるかもしれません-おそらく彼らの友人と話したり、怒っている鳥との致命的な遭遇でいくつかの余分な豚を殺すために。

ユーザーの理由が何であれ、OS開発者は、OSを実行しているデバイスが、競合他社のOSを実行しているデバイスよりも速くバッテリーを消耗するという認識を形成したくありません。そのため、彼らは開発者の利便性を犠牲にして、デバイスの予想されるバッテリー寿命のより良い認識を購入します。ユーザーにとってデバイスに満足している限り、彼らにとってあなたの痛みは大したことではありません。


3
世代別GCは、実際にはほとんどの場合、はるかに効率的であるため、クロックサイクルの数を減らすと考えるでしょう。Xboxのようなものは、世代別GCを持っていない理由Xboxesが接続されているので、それはまた、説明されていません。
レイ宮坂

まあ、それは私が Stack Overflowで聞いたことです。ただし、XBox-esについてはあまり知りません。
-dasblinkenlight

3
それはまだ質問に答えません。ガベージコレクションが明示的な割り当てよりも多くの電力を使用したとしても(これは非常に議論の余地があり、私はそれには触れません)、問題はモバイルのGCよりも明示的な割り当ての方が優れているかどうかではなく、世代別GCは、モバイルの世代別GCよりも優れています。
宮坂

1
@Rei:ゲームでは通常、すべてが決定論的である必要があります。少なくとも、予測可能なパフォーマンスが必要です。ここで数ナノ秒が無駄になり、数ナノ秒が無駄になります-予測できない時間に-ゲーム体験を台無しにする可能性があります。世代別ガベージコレクタは予測不能です。
アント

2
@djacobsonそれは本当だとは思わない。質問で私が言ったように、もしそれが世代別GCを無視しているMicrosoftのプラットフォームでしかないなら、それはたぶんロジスティック/官僚的な理由であり、私はわざわざ尋ねません。しかし、Androidも同じ問題に苦しんでいるので、技術的な理由である可能性があります。つまり、P.SEの誰かが決定的な答えを持っている可能性があります。
宮坂

3

私の最善の推測は、それが技術的な理由ではないが、それらの電話プラットフォームの開発者はまだ努力をしていないということでしょう。私はそれがあなたが望んでいる答えではないことを知っていますが、もしあなたがモバイル開発をしたなら、たぶんあなたはたぶん低いぶら下がっている果物があることに気づいたでしょう。彼らはおそらく、複数のGC実装を記述し、それらをすべて微調整し、最適なものを選択する時間がないでしょう。新しい、派手な、よく考えられていないAPIを代わりにリリースできるのに、なぜ誰かが車輪の再発明に時間を費やすのでしょうか?;)

FWIW、および私の理論の確認として、Androidの新しいランタイム(ART)には世代別GCがあり、将来、圧縮GCを使用する予定です。


2

世代別ガベージコレクションには追加のコストがかかります。

世代別コレクターは、古いオブジェクトが新しいオブジェクトを指すタイミングを検出できる必要があります。古いオブジェクトをトレースしてこれらのケースを見つけることはできません。これは、世代別コレクションの目的に反するためです。代わりに、どういうわけか、これがいつ起こるかを検出し、収集フェーズのためにそれを書き留める必要があります。それをどのように行うかに関係なく、収集プロセスにいくらかのオーバーヘッドが追加されます。

デスクトップシステムでは、オペレーティングシステムがバックグラウンドでメモリを使用してあらゆる種類の処理を実行しています。プロセス間でページを共有する、ディスクに未使用のページを書き込む、プロセス間でメモリマッピングを提供するなどの機能をサポートします。操作は既にメモリ内で何を変更するかを心配しているので、その情報を新しい目的に使用しても問題はありません。

私は、モバイルシステムが舞台裏ですべて同じことをしているのではないと考えています。その結果、デスクトップと同じレベルの情報は得られません。その結果、一般的なコレクションの実装に伴うオーバーヘッドは高くなり、その価値は低くなります。


GC生成を最大限に活用するには、書き込みフェンスを使用して、古い世代のオブジェクトがいつ書き込まれたかを検出する必要があります。一方、GCの「マーク」部分が世代から利益を得ることができなくても、新しい世代で物事を移動するだけでパフォーマンスを改善できると思います(実際には、古い世代で「タグ」フェーズをまた、新しい世代は、各世代に存在する再生可能なメモリの量を知ることができる場合に役立ちます)。
-supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.