Android內存優化基礎

1.什麼是內存泄漏:當一個對象已經不需要再使用了,本該被gc回收的時候,而有另外一個對象持有該對象的引用,就會導致該對象不被gc回收而繼續保留在堆內存中,句產生了內存泄漏。

2.java中gc回收的機制:某個對象不在被任何對象引用的時候,纔會被gc回收。

3.java內存分配的三種策略:
(1)靜態存儲區:靜態存儲區在程序編譯過程中就分配,程序運行過程中一直存在,主要用於存儲靜態數據,全局的static數據些常量;
(2)棧內存:在執行函數的時候,函數內部的一些內部變量都可以存儲在棧內存中,由於棧內存存在於處理器中,所以速度快,但是存儲空間有限;
(3)堆內存:也叫動態分配內存,在程序運行過程中動態分配,例如我們在程序中可以通過new來申請分配一個存儲區域;在c/c++需要自己負責釋放,而在java中則 只能靠gc來回收,在c/c++中是可以自己掌控內存的,但是需要很高的素養來解決內存分配的問題,但是在java中,沒有很好的辦法來解決內存問題,只能依靠gc來回 收,需要的是我們在編程的時候養成良好的編程習慣。
4. 堆與棧的區別:
堆是不連續的內存區域,堆空間比較靈活也特別大。棧式一塊連續的內存區域,大小是有操作系統覺決定的。

堆管理很麻煩,頻繁地new/remove會造成大量的內存碎片,這樣就會慢慢導致效率低下。對於棧的話,他先進後出,進出完全不會產生碎片,運行效率高且穩定。

成員變量全部存儲在堆中(包括基本數據類型,引用及引用的對象實體)—因爲他們屬於類,類對象最終還是要被new出來的。

局部變量的基本數據類型和引用存儲於棧當中,引用的對象實體存儲在堆中。—–因爲他們屬於方法當中的變量,生命週期會隨着方法一起結束。

5.我們所討論內存泄露,主要討論堆內存,他存放的就是引用指向的對象實體,有時候確實會有一種情況:當需要的時候可以訪問,當不需要的時候可以被回收也可以被暫時保存以備重複使用,例如:
ListView或者GridView、REcyclerView加載大量數據或者圖片的時候,
圖片非常佔用內存,一定要管理好內存,不然很容易內存溢出。
滑出去的圖片就回收,節省內存。看ListView的源碼—-回收對象,還會重用ConvertView。
如果用戶反覆滑動或者下面還有同樣的圖片,就會造成多次重複IO(很耗時),
那麼需要緩存—平衡好內存大小和IO,算法和一些特殊的java類。算法:lrucache(最近最少使用先回收)

6.特殊的java類:利於回收,StrongReference,SoftReference,WeakReference,PhatomReference

(1)StrongReference強引用:
回收時機:從不回收 使用:對象的一般保存 生命週期:JVM停止的時候纔會終止
(2)SoftReference,軟引用
回收時機:當內存不足的時候;使用:SoftReference結合
(3)ReferenceQueue構造有效期短;生命週期:內存不足時終止
(4)WeakReference,弱引用
回收時機:在垃圾回收的時候;使用:同軟引用; 生命週期:GC後終止
PhatomReference 虛引用
回收時機:在垃圾回收的時候;使用:合ReferenceQueue來跟蹤對象唄垃圾回收期回收的活動; 生命週期:GC後終止

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