私は、GCのパフォーマンスを向上させるためのXamarin.Androidガベージコレクションのドキュメントをreducing referenced instancesで読んでいます。Xamarin Androidのガベージコレクションアルゴリズム
部は言って始まる:
をjava.lang.ObjectのタイプまたはサブクラスのインスタンスがGC中に走査されるたびに、インスタンスが参照するオブジェクトグラフ全体もスキャンされなければなりません。オブジェクトグラフは、「ルートインスタンス」が参照するオブジェクトインスタンスのセットと、ルートインスタンスが参照するものすべてを再帰的に参照するものです。
...わかっています。
次に、標準アクティビティクラスを継承するカスタムクラスを表示します。このカスタムアクティビティクラスは、10,000文字列を持つようにコンストラクタで初期化される文字列のリストであるフィールドを持っています。これは、GC中に到達可能性のためにすべての10,000個のインスタンスをスキャンする必要があるため、悪いと言われています。私も理解しています。
List<string>
フィールドをJava.Lang.Object
から継承しない別のクラスに移動し、そのクラスのインスタンスをアクティビティから参照する必要があることが、私が明確にしていない部分です。リストのように前に参照されていた。
私の質問:インスタンスの総数が10,000のままで、開かれた段落がプロセスが再帰的であるためスキャンされると言った場合、オブジェクトグラフにフィールドを深く押し込むとGCに役立ちますか?
また、私はAndroid上でMonoが使用するSGen GC上で(here)も読んでおり、オブジェクトグラフトラバーサルプロセスは、GCルーツから幅優先で始まると説明されています。これは、10,000個のアイテムリストが各アイテムがチェックされるにつれて長いGC一時停止を引き起こす方法を説明しますが、GCが最終的にグラフに深く入るにつれて最終的にスキャンするので、
ここでの考え方は、我々は、ピアウォークを行うことを避けることです。そうでなければ、これらのオブジェクト上で 'managed'と' Java'の両方の関係を探す必要があります。通常は 'static'クラスに移動し、' Activity'派生クラスの外側でオブジェクトをルートすることができます。したがって、それはピアから独立しています。ほとんどの場合、これは大きな問題ではなく、通常はコード化するだけです。あなたのアプリをプロファイリングしてGCのボトルネックを見つけたら、今何をすべきか正確に分かります。それらのクラスを消費するピアオブジェクトからそれらのクラスを分離する。要するに、それが必要になるまでそれを心配しないでください。 –
@JonDouglasは応答に感謝します。あなたは「ピア・ウォークをする」ことが何を意味するのか、それをどうやってやるのか、それを避けるのかについて明確にしてください。一般に、XamarinのAndroidで、オブジェクトがどのように作成され、GC化されたかを説明する記事を実際に使用することができると思います。「2つのVMが並行して動作しています」というアーキテクチャが採用されています...綴りがよく、ピア・ウォークをやってみましょう。おそらくこの[Xamarin Evolve](https://www.youtube.com/watch?v=VJsmrTQWD2k)のトークで議論された問題を避けるのに役立ちます。 –