題目不知道對不對,開始寫:----html
我看的他的http://www.javashuo.com/article/p-xvqollmm-dr.htmljava
哪些內存須要回收?何時回收?如何回收?這也是經典的學習一個知識點的3h方法:what? when? how?算法
看啊看數組
一。幾種常見的垃圾收集算法服務器
一、Mark-Sweep學習
標記-清除算法,分爲標記,清除兩個階段,首先標記出全部須要回收的對象,標記完成後統一回收spa
不足:效率不高;回收後產生大量不連續的內存碎片。碎片太多的話,須要分配大對象時,沒法找到足夠的連續內存而不得不提早觸發新一輪的垃圾收集動做htm
二、Copying對象
複製算法,大多商業虛擬機都採用這種收集算法回收新生代,具體的在第三點內存分配會講到blog
三、Mark-Compact
標記-整理算法。通常使用於老年代
四、Generational Collection
分代收集算法。當前商業虛擬機的垃圾收集都採用分代收集算法,通常是把Java堆分爲新生代和老年代,根據各自特色採用最適當的收集算法。
二。(有用的來了)內存分配與回收策略
Java的自動內存管理機制能夠歸結爲解決了兩個問題:給對象分配內存以及回收分配給對象的內存。Java的內存分配策略並非絕對的或者固定的,這取決於
當前使用的垃圾收集器組合,以及虛擬機中與內存分配相關的參數設置,接下來說的是最爲廣泛的內存分配規則
1)對象優先在Eden區分配
新生代區域通常被分爲較大的Eden空間和兩塊較小的Survivor空間(一般稱爲From和To),HotSpot虛擬機默認Edon和兩個Survivor的大小比例是8:1:1,
新建立的對象通常會在Edon和From中,當Edon區沒有足夠的空間進行分配時,將觸發一次Minor GC,前面講過大多數對象是朝生夕死的,所以Minor GC很是頻繁
當一次Minor GC事後,仍然存活的對象會一次性複製到To區域中,而後清理掉Edon和From;這時候注意,From和To將交換角色,如今新的To是清理後的From
所以To區域總能保證每次Minor GC後留有必定的空間容納尚存活的對象
(2)長期存活的對象將進入老年代
虛擬機給每一個對象都定義了一個對象年齡(Age)計數器,在Edon出生的對象通過第一次Minor GC後仍然存活,並能在Survivor容納的話Age將設爲1,在Survivor區
每熬過一次Minor GC,Age+1,當Age達到設置的參數值-XX:MaxTenuringThreshold(默認值15),將晉升老年代,關於晉升老年代的條件並不是必定要達到這種狀況,
java虛擬機有動態對象年齡斷定策略,具體可閱讀本書3.6.4細節
(3)大對象直接進入老年代
所謂大對象指的是須要大量連續內存空間的對象,最典型的如很長的字符串以及數組,常常出現大對象意味着極可能內存中還有很多空間時就得提早觸發垃圾收集
以獲取足夠的連續空間來安置他們。
(4)觸發Full GC的條件
Full GC的速度通常比Minor GC慢10倍以上,觸發一次Full GC常常會伴隨一次Minor GC,一種觸發條件爲,一次Minor GC發生後將要晉升爲老年代的對象大小超過
老年代現有剩餘空間大小,這種情形不難想象。java的老年代空間分配擔保細節可細讀3.6.5節知曉,此處再也不細說
最後上圖一張做爲結尾,一目瞭然(真的嗎):
看完了吧,果真仍是不會吧,持續學習。。。道路阻且長,並且沒場景,拘說還須要jconsole,jstack啥的,還有一我的問我服務器cpu變高怎麼搞,會了還用你來面我,算了吧,
讓他裝波逼吧,擦,學起來