Android內存泄露開篇
先來想這三個問題
- 內存泄露是怎么回事
- 內存會泄露的原因
- 避免內存泄露 </ol>
1.內存泄露怎么回事
一個程序中,已經不需要使用某個對象,但是因為仍然有引用指向它垃圾回收器就無法回收它,當然該對象占用的內存就無法被使用,這就造成了內存泄露。
Android的一個應用程序的內存泄露對別的應用程序影響不大。
為了能夠使得Android應用程序安全且快速的運行,Android的每個應用程序都會使用一個專有的Dalvik虛擬機實例來運行,它是由Zygote服務進程孵化出來的,也就是說每個應用程序都是在屬于自己的進程中運行的。
Android為不同類型的進程分配了不同的內存使用上限,如果程序在運行過程中出現了內存泄漏的而造成應用進程使用的內存超過了
這個上限,則會被系統視為內存泄漏,從而被kill掉,這使得僅僅自己的進程被kill掉,而不會影響其他進程(如果是system_process等系統進程出問題的話,則會引起系統重啟)
2.出現內存泄露原因
1.資源對象沒關閉造成的內存泄露
資源性對象比如(Cursor,File文件等)往往都用了一些緩沖,我們在不使用的時候,應該及時關閉它們,以便它們的緩沖及時回收內存
2.變量的作用域不一樣導致
變量 作用域
函數變量 函數內
成員變量 整個對象內
TLS(ThreadLocalStorage) 整個線程
靜態變量 整個進場內
Binder(IPC) 進程間
因為作用域的不同,作用域大引用到對象都可能不會馬上銷毀,所以會內存泄露。
handle 的內存泄露主要 TLS變量和 activity的生命周期不一樣,。
Thread 引用其他對象也容易出現對象泄露。
3.內存壓力過大
1.圖片資源加載過多,超過內存使用空間,例如Bitmap 的使用
2.重復創建view,沒有重復使用 listview,的使用</code></pre>
3.如何避免內存泄露
1.良好的代碼規范,清晰代碼邏輯
2.對于引用生命不一樣的對象,可以用弱引用WeakReferner
3.對于資源對象 使用finally 強制關閉
4.內存壓力過大就要統一的管理內存
5.對象重復并且頻繁調用可以考慮對象池。
來自:http://blog.csdn.net/zhuanglonghai/article/details/37658661
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!