• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • android內存泄露的問題(2)

    發表于:2011-06-27來源:未知作者:領測軟件測試網采編點擊數: 標簽:Android
    強引用:引用為空的時候,Java的垃圾回收器會處理。一般來說自己寫的程序大部分都是強引用。 軟引用:堆內存不夠的時候,Java的垃圾回收器會處理這類

      強引用:引用為空的時候,Java的垃圾回收器會處理。一般來說自己寫的程序大部分都是強引用。

      軟引用:堆內存不夠的時候,Java的垃圾回收器會處理這類引用。

      弱引用:Jave的垃圾回收器每次都會回收這類引用。

      如何用MAT來分析,前提是Android開發和測試的工具安裝完整,SDK,Eclipse:

      1.打開Eclipse

      2.選擇 Help->Install New Software;

      3.在Work with中添加站點:http://download.eclipse.org/mat/1.0/update-site/(這個地址可能會變化,但是新的地址可以在官方網站上找到:http://www.eclipse.org/mat/downloads.php )

      4.生成.hprof文件:插入SD卡(Android機器很多程序都需要插入SD卡),并將設備連接到PC,在Eclipse中的DDMS中選擇要測試的進程,然后點擊Update Heap 和Dump HPROF file兩個Button。

      .hprof 文件會自動保存在SD卡上,把 .hprof 文件拷貝到PC上的\ android-sdk-windows\tools目錄下。這個由DDMS生成的文件不能直接在MAT打開,需要轉換。

      運行cmd打開命令行,cd到\ android-sdk-windows\tools所在目錄,并輸入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof為原始文件,yyyyy.hprof為轉換過后的文件。轉換過后的文件自動放在android-sdk-windows\tools 目錄下。

      OK,到此為止,.hprof文件處理完畢,可以用來分析內存泄露情況了。

      5.打開MAT:

      在Eclipse中點擊Windows->Open Perspective->Other->Memory Analysis

      6.導入.hprof文件

      在MAT中點擊 File->Open File,瀏覽到剛剛轉換而得到的.hprof文件,并Cancel掉自動生成報告,點擊Dominator Tree,并按Package分組,選擇自己所定義的Package 類點右鍵,在彈出菜單中選擇List objects->With incoming references。

      這時會列出所有可疑類,右鍵點擊某一項,并選擇Path to GC Roots->exclude weak/soft references,會進一步篩選出跟程序相關的所有有內存泄露的類。據此,可以追蹤到代碼中的某一個產生泄露的類。

      2:相關知識

      Android將進程分為六大類:

      前臺進程(foreground):目前正在屏幕上顯示的進程和一些系統進程。舉例來說,Dialer Storage,Google Search等系統進程就是前臺進程;再舉例來說,當你運行一個程序,如瀏覽器,當瀏覽器界面在前臺顯示時,瀏覽器屬于前臺進程(foreground),但一旦你按home回到主界面,瀏覽器就變成了后臺程序(background)。我們最不希望終止的進程就是前臺進程。

      可見進程(visible):可見進程是一些不再前臺,但用戶依然可見的進程,舉個例來說:widget、輸入法等,都屬于visible。這部分進程雖然不在前臺,但與我們的使用也密切相關,我們也不希望它們被終止(你肯定不希望時鐘、天氣,新聞等widget被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時都需要重新啟動輸入法)

      次要服務(secondary server):目前正在運行的一些服務(主要服務,如撥號等,是不可能被進程管理終止的,故這里只談次要服務),舉例來說:谷歌企業套件,Gmail內部存儲,聯系人內部存儲等。這部分服務雖然屬于次要服務,但很一些系統功能依然息息相關,我們時常需要用到它們,所以也太希望他們被終止。

      后臺進程(hidden):雖然作者用了hidden這個詞,但實際即是后臺進程(background),就是我們通常意義上理解的啟動后被切換到后臺的進程,如瀏覽器,閱讀器等。當程序顯示在屏幕上時,他所運行的進程即為前臺進程(foreground),一旦我們按home返回主界面(注意是按home,不是按back),程序就駐留在后臺,成為后臺進程(background)。后臺進程的管理策略有多種:有較為積極的方式,一旦程序到達后臺立即終止,這種方式會提高程序的運行速度,但無法加速程序的再次啟動;也有較消極的方式,盡可能多的保留后臺程序,雖然可能會影響到單個程序的運行速度,但在再次啟動已啟動的程序時,速度會有所提升。這里就需要用戶根據自己的使用習慣找到一個平衡點

      內容供應節點(content provider):沒有程序實體,進提供內容供別的程序去用的,比如日歷供應節點,郵件供應節點等。在終止進程時,這類程序應該有較高的優先權

      空進程(empty):沒有任何東西在內運行的進程,有些程序,比如BTE,在程序退出后,依然會在進程中駐留一個空進程,這個進程里沒有任何數據在運行,作用往往是提高該程序下次的啟動速度或者記錄程序的一些歷史信息。這部分進程無疑是應該最先終止的。系統會對進程的重要性進行評估,并將重要性以“oom_adj”這個數值表示出來,賦予各個進程;(系統會根據“oom_adj”來判斷需要結束哪些進程,一般來說,“oom_adj”的值越大,該進程被系統選中終止的可能就越高)

      前臺程序的“oom_adj”值為0,這意味著它不會被系統終止,一旦它不可訪問后,會獲得個更高的“oom_adj”,作者推測“oom_adj”的值是根據軟件在loadrunner/" target="_blank" >LRU列表中的位置所決定的;

      Android不同于Linux,有一套自己獨特的進程管理模塊,這個模塊有更強的可定制性,可根據“oom_adj”值的范圍來決定進程管理策略,比如可以設定“當內存小于X時,結束“oom_adj”大于Y的進程”。這給了進程管理腳本的編寫以更多的選擇。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>