一.內存分配的幾種策略:
1.靜態的
靜態的存儲區:內存在程序編譯的時候就已經分配好,這塊的內存在程序整個運行期間都一直存在。
它主要存放靜態數據、全局的static數據和一些常量。
2.棧式的
在執行函數(方法)時,函數一些內部變量的存儲都可以放在棧上面創建,函數執行結束的時候這些存儲單元就會自動被釋放掉。
棧內存包括分配的運算速度很快,因為內置在處理器的里面的。當然容量有限。
3.堆式的
也叫做動態內存分配。有時候可以用malloc或者new來申請分配一個內存。在C/C++可能需要自己負責釋放(java里面直接依賴GC機制)。
在C/C++這里是可以自己掌控內存的,需要有很高的素養來解決內存的問題。java在這一塊貌似程序員沒有很好的方法自己去解決垃圾內存,需要的是編程的時候就要注意自己良好的編程習慣。
區別:堆是不連續的內存區域,堆空間比較靈活也特別大。棧式一塊連續的內存區域,大小是有操作系統覺決定的。
堆管理很麻煩,頻繁地new/remove會造成大量的內存碎片,這樣就會慢慢導致效率低下。
對于棧的話,他先進后出,進出完全不會產生碎片,運行效率高且穩定。
二.成員變量與局部變量
1.成員變量全部存儲在堆中(包括基本數據類型,引用及引用的對象實體)---因為他們屬于類,類對象最終還是要被new出來的。
2.局部變量的基本數據類型和引用存儲于棧當中,引用的對象實體存儲在堆中。-----因為他們屬于方法當中的變量,生命周期會隨著方法一起結束。
三.堆內存回收
算法:lrucache(最近最少使用先回收)
特殊的java類:利于回收,StrongReference,SoftReference,WeakReference,PhatomReference
StrongReference強引用:
回收時機:從不回收 使用:對象的一般保存 生命周期:JVM停止的時候才會終止
SoftReference,軟引用
回收時機:當內存不足的時候;使用:SoftReference<String>結合ReferenceQueue構造有效期短;生命周期:內存不足時終止
WeakReference,弱引用
回收時機:在垃圾回收的時候;使用:同軟引用; 生命周期:GC后終止
PhatomReference 虛引用
回收時機:在垃圾回收的時候;使用:合ReferenceQueue來跟蹤對象唄垃圾回收期回收的活動; 生命周期:GC后終止
開發時,為了防止內存溢出,處理一些比較占用內存大并且生命周期長的對象的時候,可以盡量使用軟引用和弱引用。
軟引用比LRU算法更加任性,回收量是比較大的,你無法控制回收哪些對象。
比如使用場景:默認頭像、默認圖標。
ListView或者GridView、REcyclerView要使用內存緩存+外部緩存(SD卡)