ANDROID HACKS # Hack58  :メモリリークを突き止める by tsuruoka
メモリリークの原因をつきとめる <ul><li>そもそも Android におけるメモリリークとは何か? </li></ul><ul><ul><li>Dalvik におけるメモリ管理手法を知り それでうまくいかないケースにおちいっているのが メ...
Dakvik VM のメモリ管理手法 <ul><li>アプリが使用できるメモリの上限 (VM heap) </li></ul><ul><ul><li>これは機種によって異なる </li></ul></ul><ul><ul><ul><li>adb...
Dakvik VM のメモリ管理手法 <ul><li>より詳しく言うと・・・ </li></ul><ul><li>VMヒープの内部を 8 バイト単位で区切ったテーブル 『オブジェクトビットマップテーブル』をもっている。 </li></ul><u...
GC(マーク&スイープ) <ul><li>マークフェイズ </li></ul><ul><ul><li>現在実行しているアプリのスタック(領域)の中身などを参考に「使われているか?」を判断する </li></ul></ul><ul><ul><li...
GC(マーク&スイープ) <ul><li>スイープフェイズ </li></ul><ul><ul><li>先ほど作った  『使われているいないテーブル』 とビットマップテーブルを見比べて 使われていないオブジェクトの領域を開放する( VM hea...
メモリリークとは <ul><li>GCで VM heap に返却できない領域が 不必要に増えてしまうこと・・・ </li></ul><ul><ul><li>メモリが回収されにくい参照状態を引き起こす </li></ul></ul><ul><ul...
アロケーショントラッカー <ul><li>DDMS の Allocation Tracker から開けます </li></ul><ul><li>そのプロセスのメモリアロケーションが並びます </li></ul><ul><li>同じものがたくさん...
メモリ使用量の出力 <ul><li>String memory = &quot;Free=&quot; + Long.toString(Debug.getNativeHeapFreeSize() / 1024) + &quot;kb&quot;...
参考書籍 <ul><li>『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊) http://www.oreilly.co.jp/books/9784873114569/ </li></ul>
Upcoming SlideShare
Loading in …5
×

Android Hacks - Hack58

2,054 views

Published on

「Android Hacks ―プロが教えるテクニック & ツール」(株式会社ブリリアントサービス 著)を教材とした勉強会でのまとめ資料です。

http://www.oreilly.co.jp/books/9784873114569/

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,054
On SlideShare
0
From Embeds
0
Number of Embeds
34
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Android Hacks - Hack58

  1. 1. ANDROID HACKS # Hack58 :メモリリークを突き止める by tsuruoka
  2. 2. メモリリークの原因をつきとめる <ul><li>そもそも Android におけるメモリリークとは何か? </li></ul><ul><ul><li>Dalvik におけるメモリ管理手法を知り それでうまくいかないケースにおちいっているのが メモリリーク </li></ul></ul>
  3. 3. Dakvik VM のメモリ管理手法 <ul><li>アプリが使用できるメモリの上限 (VM heap) </li></ul><ul><ul><li>これは機種によって異なる </li></ul></ul><ul><ul><ul><li>adb shell getprop dalvik.vm.heapsize で確認できます </li></ul></ul></ul><ul><li>アプリケーションは新しいオブジェクトを作るとき、この VM heap からメモリを確保する </li></ul><ul><li>メモリが確保できなくなったら GC を呼び出す </li></ul>
  4. 4. Dakvik VM のメモリ管理手法 <ul><li>より詳しく言うと・・・ </li></ul><ul><li>VMヒープの内部を 8 バイト単位で区切ったテーブル 『オブジェクトビットマップテーブル』をもっている。 </li></ul><ul><li>数値や文字列を定義するたびにそのためのメモリが VM heap から 確保されるが、確保した領域をこのテーブルに記録する。 </li></ul><ul><li>オブジェクトが次々に作られ、 VM heap の容量が限界に近く(ある閾値を越えたとき)GCが実行される </li></ul><ul><li>GC </li></ul><ul><ul><li>オブジェクトビットマップテーブルで『使用中』となっている部分に対して 本当に使用中になっているか?をチェック。未使用ならば free にする。 </li></ul></ul><ul><ul><li>マーク&スイープという方式で実行されます </li></ul></ul>
  5. 5. GC(マーク&スイープ) <ul><li>マークフェイズ </li></ul><ul><ul><li>現在実行しているアプリのスタック(領域)の中身などを参考に「使われているか?」を判断する </li></ul></ul><ul><ul><li>具体的にはそのオブジェクトへの参照があるか?ないか?なければ使われていない。 </li></ul></ul><ul><ul><li>そういう『使われている / いないリスト』を作る </li></ul></ul>
  6. 6. GC(マーク&スイープ) <ul><li>スイープフェイズ </li></ul><ul><ul><li>先ほど作った  『使われているいないテーブル』 とビットマップテーブルを見比べて 使われていないオブジェクトの領域を開放する( VM heap へ返却)ことでGCが完了する </li></ul></ul>
  7. 7. メモリリークとは <ul><li>GCで VM heap に返却できない領域が 不必要に増えてしまうこと・・・ </li></ul><ul><ul><li>メモリが回収されにくい参照状態を引き起こす </li></ul></ul><ul><ul><li>細かいメモリ確保を繰り返す </li></ul></ul><ul><ul><ul><li>GC中はGC以外は動かなくなる </li></ul></ul></ul><ul><li>それを察知するには </li></ul><ul><ul><li>メモリ使用量が単調増加している </li></ul></ul><ul><ul><li>頻繁なメモリアロケーションが発生している </li></ul></ul><ul><li> を見つければよい </li></ul>
  8. 8. アロケーショントラッカー <ul><li>DDMS の Allocation Tracker から開けます </li></ul><ul><li>そのプロセスのメモリアロケーションが並びます </li></ul><ul><li>同じものがたくさん並んでいるときは メモリリークかもしれません </li></ul>
  9. 9. メモリ使用量の出力 <ul><li>String memory = &quot;Free=&quot; + Long.toString(Debug.getNativeHeapFreeSize() / 1024) + &quot;kb&quot; + // 空きヒープサイズ </li></ul><ul><li>&quot;, Allocated= &quot; + Long.toString(Debug.getNativeHeapAllocatedSize() / 1024) + &quot;kb&quot; + // 使用中ピープサイズ </li></ul><ul><li>&quot;, Size=&quot; + Long.toString(Debug.getNativeHeapSize() / 1024) + &quot;kb&quot;; // 確保しているヒープサイズ </li></ul><ul><li>Log.i(&quot;Heap&quot;, memory); </li></ul><ul><li>あるいは </li></ul><ul><li>adb shell vmstat </li></ul><ul><li>がオススメ。 </li></ul><ul><li>参考  http://linuxtips.sblo.jp/article/29251461.html </li></ul><ul><li>swpd 仮想メモリの量 </li></ul><ul><li>free  現在空いている実メモリの量 </li></ul>
  10. 10. 参考書籍 <ul><li>『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊) http://www.oreilly.co.jp/books/9784873114569/ </li></ul>

×