コードハイライト用

せっかく無職になったから、働いてる時に忙しくて出来なかった色々な事をやってみようと場当たり的に始めたブログ。 だったけど就職決まっちゃいました。

2012年2月29日水曜日

[Android] メモリの確保状況をデバッグする

GLSurfaceView を実装してテクスチャゴリゴリ書いてたら
一定の周期で画面がカクつきだした。

ググるとガベージコレクションが動作する際に処理が長時間ブロックされる、と。

ログをよく見ると確かにGCが頻繁にログをだしていたので、
こりゃいかんと eclipse でのメモリ確保状況を調べる事にチャレンジ。

以下備忘録兼ねて手順。


1.eclipseからデバッグしたいアプリを実行する


いつもの要領で。



2.DDMSパースペクティブを開く


レイアウトによりますが、とりあえずデフォルトだと右上のこいつ。



3.実行中デバイスのデバッグしたいスレッドを選択


Devices ビューに実行中のデバイス一覧が表示されています。
更にデバイスからスレッドの一覧が表示されているので、デバッグしたいスレッドを選択。
今回は「system_process」にします。



4.「Allocation Tracker」ビューの「Start Tracking」を選択


最初は何も表示されていないと思いますが、「Start Tracking」を押すと
メモリの監視が開始します。



5.「Allocation Tracker」ビューの「Get Allocations」を選択して結果を取得する


「Start Tracking」を押した以降のメモリの確保状況が出力されます。
確保されたクラス、サイズ、スレッドID、どのクラスのどのメソッドから、等かなり詳細に出ます。


更に良い事に、確保項目を選択すると、ビューの下半分に確保時のスタックトレースが表示されます。
今日はこれで大分助けられた。


今回の自分の場合は、テクスチャ描画時のコマンド引数用に
ローカル定義していた byte[] や float[] が大量にリストされており、そいつらの掃除のためにGCが頻繁に動いていました。

それらローカル変数をメンバ変数として、テクスチャ生成時から破棄時まで使いまわす形に修正したところ
目に見えてカクつきが抑えられました。ほんと良かった。

0 件のコメント:

コメントを投稿