<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 15.2 內存泄露分析之MAT工具 MAT的全稱是Eclipse Memory Analyzer,它是一款強大的內存泄露分析工具,MAT不需要安裝,下載后解壓即可使用,下載地址為http://www.eclipse.org/mat/downloads.php。對于Eclipse來說,MAT也有插件版,但是不建議使用插件版,因為獨立版使用起來更加方便,即使不安裝Eclipse也可以正常使用,當然前提是有內存分析后的hprof文件。 為了采用MAT來分析內存泄露,下面模擬一種簡單的內存泄露情況,下面的代碼肯定會造成內存泄露: public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private static Context sContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sContext = this; } } 編譯安裝,然后打開DDMS界面,其中AndroidStudio的DDMS位于Monitor中。接著用鼠標選中要分析的進程,然后使用待分析應用的一些功能,這樣做是為了將盡量多的內存泄露暴露出來,然后單擊Dump HPROF file這個按鈕(對應圖15-1中底部有黑線的按鈕),等待一小段時間即可導出一個hprof后綴的文件,如圖15-1所示。 :-: ![](https://img.kancloud.cn/2e/d5/2ed533218cae855b910a07bcbe3a736b_1361x528.png) 圖15-1 DDMS視圖 導出hprof文件后并不能使用它來進行分析,因為它不能被MAT直接識別,需要通過hprof-conv命令轉換一下。hprof-conv命令是Android SDK提供的工具,它位于Android SDK的platform-tools目錄下: hprof-conv com.ryg.chapter_15.hprof com.ryg.chapter_15-conv.hprof 當然如果使用的是Eclipse插件版的MAT的話,就可以不進行格式轉換了,可以直接用MAT插件打開。 經過了上面的步驟,接下來就可以直接通過MAT來進行內存分析了。打開MAT,通過菜單打開剛才轉換后的com.ryg.chapter_15-conv.hprof這個文件,打開后的界面如圖15-2所示。 :-: ![](https://img.kancloud.cn/3d/a3/3da31abd2c291b059203c376790abdcb_967x611.png) 圖15-2 MAT的內存分析主界面 如圖15-2所示,MAT提供了很多功能,但是最常用的只有Histogram和Dominator Tree,通過Histogram可以直觀地看出內存中不同類型的buffer的數量和占用的內存大小,而Dominator Tree則把內存中的對象按照從大到小的順序進行排序,并且可以分析對象之間的引用關系,內存泄露分析就是通過Dominator Tree來完成的。圖15-3和圖15-4分別是MAT中Histogram和Dominator Tree的界面。 :-: ![](https://img.kancloud.cn/ed/24/ed24b6b23e0f5ced8ce4cf9daa77568e_970x607.png) 圖15-3 MAT中Histogram的界面 :-: ![](https://img.kancloud.cn/e5/b9/e5b964fc23ba0fff0be423d6502951eb_965x606.png) 圖15-4 MAT中Ddominator Tree的界面 為了分析內存泄露,我們需要分析Dominator Tree里面的內存信息,在Dominator Tree中內存泄露的原因一般不會直接顯示出來,這個時候需要按照從大到小的順序去排查一遍。一般來說Bitmap泄露往往都是由于程序的某個地方發生了內存泄露都引起的,在圖15-4中的第2個結果就是一個Bitmap泄露,選中它然后單擊鼠標右鍵->Path To GC Roots->exclude wake/soft references,如圖15-5所示。可以看到sContext引用了Bitmap最終導致了Bitmap無法釋放,但其實根本原因是sContext無法釋放所導致的,這樣我們就找出了內存泄露的地方。Path To GC Roots過程中之所以選擇排除弱引用和軟引用,是因為二者都有較大幾率被gc回收掉,它們并不能造成內存泄露。 :-: ![](https://img.kancloud.cn/e0/07/e007163175263f90b66318f210ccaf2f_1338x600.png) 圖15-5 Path To GC Roots后的結果 在Dominator Tree界面中是可以使用搜索功能的,比如我們嘗試搜索MainActivity,因為這里我們已經知道MainActivity存在內存泄露了,搜索后的結果如圖15-6所示。我們發現里面有6個MainActivity的對象,這是因為每次按back鍵退出再重新進入MainActivity,系統都會重新創建一個新的MainActivity,但是由于老的MainActivity無法被回收,所以就出現了多個MainActivity對象的情形。另外MAT還有很多其他功能,這里就不再一一介紹了,請讀者自己體驗吧。 :-: ![](https://img.kancloud.cn/a9/64/a964f9c1bcb4026f174f7a23afde7071_1110x610.png) 圖15-6 Dominator Tree的搜索功能
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看