2010-12-27 1 views
5

私はAndroidでアプリケーションを開発しています。センサーデータを連続的に処理する、長時間実行されるアプリケーションです。アプリケーションを実行している間、私はlogcatに多くのGCメッセージを表示します。毎秒約1回。Dalvik GCの動作を分析するには?

これは、オブジェクトが作成され、ループ内ですぐに参照解除されるためです。

どのオブジェクトを作成してすぐにリリースするのかをどのように見つけることができますか?

私が試した(*)すべてのJavaヒープ解析ツールは、ヒープ上のオブジェクトの数とサイズに悩まされます。それらは便利ですが、 一時的な 短命オブジェクトが最も多く作成されるサイトを見つけることにもっと興味があります。

(*)私はjcatEclipse MATを試しました。私はhatをAndroidヒープダンプで動かすことができませんでした。それはサポートされていないダンプファイルのバージョンを訴えました。

答えて

4

どのオブジェクトをすぐに作成してリリースするのかはどのようにして見つけるのですか?

ステップ#1:一時的にあなたのコードを変更(またはあなたのコードの関連部分とスクラップのプロジェクトを作成します)、あなたはセンサ処理ロジックによって正確に一度だけ実行するには、ボタンか何かをクリックすることができます。

ステップ2:DDMS(スタンドアロンまたはEclipseパースペクティブ)に入ります。

ステップ#3:それはステップ#1からのボタンクリックを待っているポイントにアプリケーションを取得し、[開始]をクリックしてください:あなたのエミュレータを選択し、ステップ#4

割り当てトラッカー]タブをクリックします「DDMS割り当てトラッカー」タブでのトラッキング

ステップ4:ボタンをクリックし、センサー処理パスが完了したら、DDMS割り当てトラッカータブで割り当てを取得をクリックします。

これは、コードのその部分に割り当てられた内容を示します。それはGCサイクルが実行されるまで不確定なので、 "解放された"ものは何も教えてくれません。

EDIT

は、私は確かではないけど、android.os.DebugクラスのstartAllocCounting()がスタートトラッキングボタンをクリックするのと同じ効果を有することができます。もしそうなら、上で概説したコードの変更を混乱させるのではなく、ループの1回のパスで割り当てを追跡するようにコードを単純に測ることができます。

DDMSと割り当て追跡に関するFWIW、here is a short technical article

+1

重投稿:コードを変更せずに割り当てトラッカーを実行していない理由は\?(少なくとも最初の) –

+1

@Pedro Loureiro:まず、問題のループの外で多くの割り当てを行うと、割り当てリストは本当に長くなる可能性があります。第2に、ループそのものが、リストを管理するのに不可能なほど長くなる可能性があります。コードの関連するセグメントに1回のパスを分けると、データを理解するのが最も簡単になります。しかし、あなたのコメントは何かを私に思い出させてくれました。私は答えに瞬間的に追加していきます... – CommonsWare

+0

割り当てトラッカーへのポインタありがとう。完全にそれを逃していた。 Btwは、Eclipse統合(ADT)でドキュメントが利用できないと言っています – HRJ

1

私はあなたが割り当てトラッカーを試してみる必要があると思います:)

(あなた/ツールのディレクトリに)

http://developer.android.com/resources/articles/track-mem.html

+0

ああありがとう!アロケーション・トラッカーは、Eclipse統合では利用できないと思われたので、私はそれを見逃していました。 – HRJ

+1

これは、記録のためだけです:) – manmal

関連する問題