android Jvm 筆記。內存溢出。內存區域劃分。垃圾回收氣

native 溢出 也就是 direct memory 內存溢出 直接內存,不是虛擬機內存。是系統內存。


是因爲 申請的內存在 direct memory 中,垃圾回收進行時,會對 direct memory 進行回收。但是direct memory 不能像,新生代,老年代那樣,
發現內存控件不足了就通知收集器進行垃圾回收,他只能等待 老年代 滿了後 Full GC,然後 “順帶着”幫他清理掉內存的廢氣對象。否則他只能一直等到拋出內存異常時,先 catch 掉,在catch塊中 “大喊”一聲 System.gc()。要是虛擬機還是不聽(System.gc設置關閉,調用不起作用 參數 -XX:+DiskableExplicitGC開關)。那就只能眼睜睜的看着堆中還有很多空閒內存。自己卻不得不拋出內存溢出異常了。




垃圾收集器


新生代收集器 採用 複製算法。


serial 連續的, jdk 1.3.1之前是新生代手機的唯一選擇。單線程收集器。收集時,會暫停其他所有工作線程,直到他結束。Stop The World。
       (單個Cpu的環境來說)效率高,由於暫停了其他線程,沒有線程交互的開銷,只有他一個專心做垃圾收集獲得最高的單線程收集效率。
   (多個的話)他暫停了 其他cpu的工作。就低了。

ParNew 收集器其實就是 Serial收集器 的多線程版本。其他跟serial收集器完全一下。新生代收集器。只有他能與CMS(concurrent mark sweep)收集器配合工作。
       CPU較少情況下,不一定不 serial收集器高效。 他對於GC是系統資源的有效利用還是有好處的。


併發與並行收集器 概念(指多線程下)


並行(Parallel):指多天垃圾收集線程並行工作,但此時用戶線程仍處於等待狀態。


併發(Concurrent):指用戶線程與垃圾收集線程同時執行(但不一定是並行的,可能會交替執行),用戶程序在繼續執行,而垃圾收集程序運行於另一個CPU上。


Parallel Scavenge 收集器 目標是達到一個可用控制的吞吐量。可以自適應調節。


老年代 收集器 
Serial Old 收集器 單線程收集器,使用 “標記-整理” 算法


Parallel old 收集器 老年代收集器,使用多線程和“標記-整理”算法。在 jdk1.6纔開始提供。


CMS(Concurrent Mark Sweep)收集器 是一種以獲取最短回收停頓時間爲目標的收集器。使用“標記-清除” 算法。
運作過程複雜,分4個步驟:
1、初始標記
2、併發標記
3、重新標記
4、併發清除


初始標記、重新標記 會stop the world。 但很快。另外2個比這個耗時,但可以與用戶線程一起工作。


缺點: 看書


詳情請看 深入理解java虛擬機一書。


G1 收集器
看書瞭解


能用接口就不用抽象類,能用抽象類就不用類

就是接口的抽象級別是最高的,也是最靈活的,有時候類繼承用的多了反而會讓結構不可控制

就是開閉原則嘛
 



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