2011-11-10 5 views
0

を終えた私たちは、2つのアクティビティを持っているサンプルコード https://github.com/PVoLan/TestActivityDisposeMonodroid - 空きメモリ活動はここ

見つけることができます。 1つはボタンが2番目のアクティビティにつながっています。 2番目のアクティビティには30個のTextView(複雑なUIをシミュレート)と戻るボタンがあります。

前後のアクティビティを切り替えると、GREFの量がすぐに増えます。オーバーフロー2kの限界とクラッシュアプ​​リケーションには、前方と後方をクリックするのに約60回かかる。

Androidログはリポジトリにあります。ログから見ることができるように、GREFオーバーフローはTextViews(1543 GREF)が原因で最も発生します。別のGREFSは以下のとおりです。

  • ボタン(55 GREFs) - 戻るボタン、明らか
  • OnClickListenerImplementor(55 GREFs) - backButton.Clickのlistenters
  • Activity2(54 GREFs)
  • テント(54 GREFs) - 活動スターター

我々が見ることができるように、活動のリソースが解放されていないとき、活動終了(OnDestroyが呼ばれている) どのように私はこのすべてGREFsが適切に解放することができますか?

答えて

1

問題は、プロセスに2つのGCがあり(Dalvik & Mono)、どちらも使用しているメモリの量がわかりません。たとえば、すべてのモノがTextViewインスタンスのために本当に小さなオブジェクト(Java.Lang.Objectと大きくIntPtrおよびその他のサポートフィールド)で見ている:

バインドタイプのほとんどのために、結果のないデータメンバが存在しない、ある
namespace Java.Lang { 
    public class Object { 
     IntPtr handle; 
     // ... 
    } 
} 
namespace Android.Widget { 
    public class TextView : Java.Lang.Object { 
     // ... 
    } 
} 

、C#ラッパーは非常に小さいです。 Monoは、Object.handleに関連付けられたJavaオブジェクトが存在し、(さらに重要なことに)オブジェクトが参照しているメモリの量を知ることはできません。

その結果、あなたは時折、それを支援する必要があります。

// https://github.com/PVoLan/TestActivityDispose/blob/master/Test/Activity2.cs 
public class Activity2 { 
    // ... 
    protected override void OnDestroy() 
    { 
     Android.Util.Log.Info("----------", "Destroy"); 
     base.OnDestroy(); 
     GC.Collect(); 
    } 
} 

追加GC.Collect()呼び出しはMonoのGCに実行し、ゴミのオブジェクトを収集する機会を提供します。その行を追加した後、繰り返し「Hello World、Click Me!」をタップします。 「戻る」レベルは93-126のgrefsでレベルを上げています(活動している活動によって異なります)。

+0

これはテストサンプルで動作しますが、実際のプロジェクトでは予期しない例外が発生します。[ここに記載されています](http://stackoverflow.com/questions/7599737/monodroid-gc-collect-fails-without-any-reason) 。モノドイドでGCのいくつかの問題について聞いたことがあります。この質問が投稿されたとき、私はmonodroidの1.0.2バージョンを使用しました。今は最新のベータ版を使用していますが、問題はまだ実際です。 – PVoLan

+0

@PVoLan:デバイスを再起動して、それが役立つかどうか確認してください。 – jonp

+0

エミュレータを再起動して、クリアHTCを使用しようとしました。無効。私はまた、テストサンプルで例外を表現しようとしていますが、まだそれをキャッチすることはできません。私が成功するなら、あなたに通知します – PVoLan

関連する問題