Android內(nèi)存泄漏_第1頁
Android內(nèi)存泄漏_第2頁
Android內(nèi)存泄漏_第3頁
Android內(nèi)存泄漏_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、java 內(nèi)存泄漏是每個java 程序員都會遇到的問題,程序在本地運行一切正常,可是布署到遠端就會出現(xiàn)內(nèi)存無限制的增長,最后系統(tǒng)癱瘓,那么如何最快最好的檢測程序的穩(wěn)定性,防止系統(tǒng)崩盤,作者用自已的親身經(jīng)歷與各位網(wǎng)友分享解決這些問題的辦法。作為internet 最流行的編程語言之一,java 現(xiàn)正非常流行。我們的網(wǎng)絡(luò)應(yīng)用程序就主要采用java 語言開發(fā), 大體上分為客戶端、服務(wù)器和數(shù)據(jù)庫三個層次。在進入測試過程中,我們發(fā)現(xiàn) 有 一 個 程 序 模 塊 系 統(tǒng) 內(nèi) 存 和cpu資 源 消 耗 急 劇 增 加 , 持 續(xù) 增 長 到 出 現(xiàn)java.lang.outofmemoryerror為止。經(jīng)

2、過分析java內(nèi)存泄漏是破壞系統(tǒng)的主要因素。這里與大家分享我們在開發(fā)過程中遇到的java內(nèi)存泄漏的檢測和處理解決過程. 本文先介紹java 的內(nèi)存管理,以及導(dǎo)致java 內(nèi)存泄露的原因。一. java是如何管理內(nèi)存為了判斷 java 中是否有內(nèi)存泄露,我們首先必須了解java 是如何管理內(nèi)存的。java的內(nèi)存管理就是對象的分配和釋放問題。在java 中,內(nèi)存的分配是由程序完成的,而內(nèi)存的釋放是由垃圾收集器(garbage collection ,gc)完成的,程序員不需要通過調(diào)用函數(shù)來釋放內(nèi)存,但它只能回收無用并且不再被其它對象引用的那些對象所占用的空間。java 的內(nèi)存垃圾回收機制是從程序的

3、主要運行對象開始檢查引用鏈,當(dāng)遍歷一遍后發(fā)現(xiàn)沒有被引用的孤立對象就作為垃圾回收。gc 為了能夠正確釋放對象,必須監(jiān)控每一個對象的運行狀態(tài),包括對象的申請、引用、被引用、賦值等,gc 都需要進行監(jiān)控。監(jiān)視對象狀態(tài)是為了更加準確地、及時地釋放對象,而釋放對象的根本原則就是該對象不再被引用。在 java中,這些無用的對象都由gc 負責(zé)回收,因此程序員不需要考慮這部分的內(nèi)存泄露。雖然,我們有幾個函數(shù)可以訪問gc,例如運行g(shù)c 的函數(shù) system.gc(),但是根據(jù)java語言規(guī)范定義, 該函數(shù)不保證jvm 的垃圾收集器一定會執(zhí)行。因為不同的jvm 實現(xiàn)者可能使用不同的算法管理gc。通常 gc 的線程

4、的優(yōu)先級別較低。jvm 調(diào)用 gc 的策略也有很多種,有的是內(nèi)存使用到達一定程度時,gc 才開始工作,也有定時執(zhí)行的,有的是平緩執(zhí)行g(shù)c,有的是中斷式執(zhí)行g(shù)c。但通常來說,我們不需要關(guān)心這些。二. 什么是 java中的內(nèi)存泄露導(dǎo)致內(nèi)存泄漏主要的原因是,先前申請了內(nèi)存空間而忘記了釋放。如果程序中存在對無用對象的引用, 那么這些對象就會駐留內(nèi)存,消耗內(nèi)存,因為無法讓垃圾回收器gc 驗證這些對象是否不再需要。如果存在對象的引用,這個對象就被定義為有效的活動 ,同時不會被釋放。要確定對象所占內(nèi)存將被回收,我們就要務(wù)必確認該對象不再會被使用。典型的做法就是把對象數(shù)據(jù)成員設(shè)為null 或者從集合中移除該對

5、象。但當(dāng)局部變量不需要時,不需明顯的設(shè)為 null,因為一個方法執(zhí)行完畢時,這些引用會自動被清理。在 java 中,內(nèi)存泄漏就是存在一些被分配的對象,這些對象有下面兩個特點,首先,這些對象是有被引用的,即在有向樹形圖中,存在樹枝通路可以與其相連;其次,這些對象是無用的, 即程序以后不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定為java 中的內(nèi)存泄漏,這些對象不會被gc 所回收,然而它卻占用內(nèi)存。這里引用一個??吹降睦?,在下面的代碼中,循環(huán)申請object 對象,并將所申請的對象放入一個vector 中,如果僅僅釋放對象本身,但因為vector 仍然引用該對象,所以這個對象對

6、 gc 來說是不可回收的。因此,如果對象加入到vector 后,還必須從vector 中刪除,最簡單的方法就是將vector 對象設(shè)置為null 。vector v = new vector(10); for (int i = 1; i install new software; 3.在 work with 中添加站點: /mat/1.0/update-site/( 這個地址可能會變化,但是新的地址可以在官方網(wǎng)站上找到:/mat/downloads.php ) 4.生成 .hprof 文件 :插入 s

7、d 卡(android 機器很多程序都需要插入sd 卡),并將設(shè)備連接到 pc, 在 eclipse 中的 ddms 中選擇要測試的進程, 然后點擊update heap 和 dump hprof file 兩個 button。.hprof 文 件 會 自 動 保 存 在sd卡 上 , 把.hprof 文 件 拷 貝 到pc上 的 android-sdk-windowstools目錄下。這個由ddms 生成的文件不能直接在mat 打開,需要轉(zhuǎn)換。運行 cmd 打開命令行, cd 到 android-sdk-windowstools 所在目錄,并輸入命令hprof-conv xxxxx.hpro

8、f yyyyy.hprof,其中 xxxxx.hprof 為原始文件,yyyyy.hprof 為轉(zhuǎn)換過后的文件。轉(zhuǎn)換過后的文件自動放在android-sdk-windowstools 目錄下。ok,到此為止, .hprof 文件處理完畢,可以用來分析內(nèi)存泄露情況了。5.打開 ma t:在 eclipse 中點擊 windows-open perspective-other-memory analysis 6.導(dǎo)入 .hprof 文件在 mat 中點擊file-open file, 瀏覽到剛剛轉(zhuǎn)換而得到的.hprof 文件,并 cancel 掉自動生成報告 ,點擊 dominator tree,

9、并按 package分組,選擇自己所定義的package 類點右鍵,在彈出菜單中選擇list objects-with incoming references 。這時會列出所有可疑類,右鍵點擊某一項,并選擇path to gc roots-exclude weak/soft references,會進一步篩選出跟程序相關(guān)的所有有內(nèi)存泄露的類。據(jù)此,可以追蹤到代碼中的某一個產(chǎn)生泄露的類。2:相關(guān)知識android 將進程分為六大類:前臺進程 (foreground) :目前正在屏幕上顯示的進程和一些系統(tǒng)進程。舉例來說,dialer storage,google search 等系統(tǒng)進程就是前臺進

10、程;再舉例來說,當(dāng)你運行一個程序,如瀏覽器,當(dāng)瀏覽器界面在前臺顯示時,瀏覽器屬于前臺進程(foreground),但一旦你按home 回到主界面,瀏覽器就變成了后臺程序(background)。我們最不希望終止的進程就是前臺進程??梢娺M程 (visible) :可見進程是一些不再前臺,但用戶依然可見的進程,舉個例來說:widget、輸入法等, 都屬于 visible。這部分進程雖然不在前臺,但與我們的使用也密切相關(guān),我們也不希望它們被終止(你肯定不希望時鐘、天氣,新聞等widget 被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時都需要重新啟動輸入法) 次要服務(wù) (secon

11、dary server):目前正在運行的一些服務(wù)(主要服務(wù),如撥號等,是不可能被進程管理終止的,故這里只談次要服務(wù)),舉例來說:谷歌企業(yè)套件,gmail 內(nèi)部存儲,聯(lián)系人內(nèi)部存儲等。這部分服務(wù)雖然屬于次要服務(wù),但很一些系統(tǒng)功能依然息息相關(guān),我們時常需要用到它們,所以也太希望他們被終止。后臺進程 (hidden):雖然作者用了hidden 這個詞, 但實際即是后臺進程(background) ,就是我們通常意義上理解的啟動后被切換到后臺的進程,如瀏覽器, 閱讀器等。 當(dāng)程序顯示在屏幕上時,他所運行的進程即為前臺進程(foreground) ,一旦我們按home 返回主界面 (注意是按 home,

12、不是按back),程序就駐留在后臺,成為后臺進程(background)。后臺進程的管理策略有多種: 有較為積極的方式,一旦程序到達后臺立即終止,這種方式會提高程序的運行速度,但無法加速程序的再次啟動;也有較消極的方式,盡可能多的保留后臺程序,雖然可能會影響到單個程序的運行速度,但在再次啟動已啟動的程序時,速度會有所提升。這里就需要用戶根據(jù)自己的使用習(xí)慣找到一個平衡點內(nèi)容供應(yīng)節(jié)點(content provider) :沒有程序?qū)嶓w,進提供內(nèi)容供別的程序去用的,比如日歷供應(yīng)節(jié)點,郵件供應(yīng)節(jié)點等。在終止進程時,這類程序應(yīng)該有較高的優(yōu)先權(quán)空進程 (empty):沒有任何東西在內(nèi)運行的進程,有些程序,比如bte,在程序退出后,依然會在進程中駐留一個空進程,這個進程里沒有任何數(shù)據(jù)在運行,作用往往是提高該程序下次的啟動速度或者記錄程序的一些歷史信息。這部分進程無疑是應(yīng)該最先終止的。系統(tǒng)會對進程的重要性進行評估,并將重要性以 “oom_adj”這個數(shù)值表示出來,賦予各個進程;(系統(tǒng)會根據(jù)“ oom_adj”來判斷需要結(jié)束哪些進程,一般來說,“oom_adj”的值越大,該進程被系統(tǒng)選中終止的可能就越高) 前臺程序的“oom_adj”值為0,這意味著它不會被系統(tǒng)終止,一旦它不可訪問后,會獲 得 個 更 高 的 “ oom_adj ” , 作 者

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論