android第一篇:安卓內存優化,泄漏與引用

3:安卓性能優化之內存優化

  1. 爲什麼要做內存優化?

如果不優化內存,1)app運行內存是有限制的,因爲安卓手機是多任務系統同時運行多個app,不做限制,一個app運行吃光內存,其它app就運行不了,應用分配的內存要麼256m,要麼512m。超出這個限制大小,就會oom。2)內存佔用太大不做優化,在流暢性,響應速度,用戶體驗上都會有較大影響。

  1. 安卓內存的管理方式

2.1)安卓系統內存分配方式和回收方式

2.2)app內存限制機制,app運行吃內存大戶是圖片。

2.3)切換應用時,後臺app清理機制。App前後臺切換時,用的LRUCache算法,最近使用的排在最前面,最少可能被清理掉。運行app太多,內存不夠時,後臺應用清理順序由後往前清理。當系統內存有變化時,系統會通過onTrim

Memory()發出通知給各個應用,收到此通知,如果系統內存很少了,代表系統要清理後臺的app了。這時候你做相應的處理,把你的app裏面不用的內存儘快清理釋放掉,這樣你app內存佔用就會小一點。從而可能被慢些清理。

2.4)監控內存的幾種方法,app運行先只會分配一部分內存,其中會剩餘一部分內存,但內存不夠時再分配一部分內存,能分配到的總內存,不會超過最大內存。

 

 

 

2:內存泄漏:堆中存在不再被使用的對象因爲有引用存在不能被垃圾回收器回收,就是內存泄露(比如:我們vm層對repo層的引用在界面銷燬時,其實是釋放了的,因爲vm是成員變量持有repo對象,而view層只是局部變量接收vm對象,所以沒有持有vm層的引用),造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等後果。用戶可使用的內存空間分爲以下3部分:

  1. 靜態存儲區:一直會存在,不會消失,一般爲全局變量,靜態變量和常量。存於方法區

  2. 動態存儲區:是代碼執行過程中,根據需要動態分配和動態釋放的存儲單元。包括局部變量,形參和函數調用時的現場保護與返回地址。包括堆和棧

  3. 程序存儲區:存放函數體的二進制代碼。

  4. 靜態成員變量,是共享數據,存於共享區,即方法區中。

  5. 非靜態成員變量,在堆內存中,作用於整個類。

  6. 形參,局部變量存於棧中,屬於動態存儲區。

所以,類中成員變量,在銷燬時,都建議置空,不需要成員變量放置的view,全部寫成局部變量。

 

 

1:引用持有:在一個類中訪問另一個類的成員變量或者方法,通過持有另一個類的引用來訪問。

  1. 強引用StrongReference:強引用不會被垃圾回收器回收,即使當前內存空間不足,jvm也不會回收它,而是拋出OOM,使程序異常終止。取消強引用將其賦值爲null,jvm在合適的時機會回收。

強引用具體包括哪些?

A類要訪問B類中的方法或者成員變量,就會new B類的對象,這就是強引用。私有靜態內部類B2一般都用弱引用嵌套A1類設置對象,訪問A1類中的變量和方法。

  1. 軟引用SoftReference:內存空間足夠的時候,不會被垃圾回收器回收,只有在內存空間不足時,軟引用纔會被垃圾回收器回收。可以手動調用System.gc();回收垃圾調試

  2. 弱引用WeakReference:當jvm做垃圾回收或者手動調用System.gc()一旦發現弱引用對象,不論內存空間是否充足,都會將弱引用回收。不過垃圾回收是一個優先級較低的現象,所以不能迅速回收弱引用對象。

  3. 虛引用PhantomReference:相當於沒有引用,任何時候都可能被垃圾回收器回收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章