native 溢出 也就是 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 收集器
看書瞭解
能用接口就不用抽象類,能用抽象類就不用類
|
就是接口的抽象級別是最高的,也是最靈活的,有時候類繼承用的多了反而會讓結構不可控制
|
就是開閉原則嘛
|