jvm(2)理解

如下內容摘自百度-知道,主要是以爲能夠很好的理解,因此進行了copy經常使用的GC算法:1)標記非活動對象--何爲非活動對象,通俗的講,就是無引用的對象。追蹤root對象算法: 深度追蹤root對象,將heap中全部被引用到的root作標誌,全部未被標誌的對象視爲非活動對象,所佔用的空間視爲非活動內存。2)清理非活動對象Copy算法: 方法:將內存分爲兩個區域(from space和to space)。全部的對象分配內存都分配到from space。在清理非活動對象階段,把全部標誌爲活動的對象,copy到to space,以後清楚from space空間。而後互換from sapce和to space的身份。既原先的from space變成to sapce,原先的to space變成from space。每次清理,重複上述過程。優勢:copy算法不理會非活動對象,copy數量僅僅取決爲活動對象的數量。而且在copy的同時,整理了heap空間,即,to space的空間使用始終是連續的,內存使用效率獲得提升。缺點:劃分from space和to space,內存的使用率是1/2。 Compaction算法: 方法:在清理非活動對象階段,刪除非活動對象佔用內存,而且把活動對象向heap的底部移動,直到全部的活動對象被移到heap的一側。 優勢:無須劃分from sapce和to space,提升內存的使用率。而且compaction後的內存空間也是連續分配的。 缺點:該算法相對比較複雜。 sun jdk gc介紹:在減小gc以前,先來看看來自IBM的一組統計數據:98%的java對象,在建立以後不久就變成了非活動對象;只有2%的對象,會在長時間一直處於活動狀態。若是能對這兩種對象區分對象,那麼會提交GC的效率。在sun jdk gc中(具體的說,是在jdk1.4以後的版本),提出了不一樣生命週期的GC策略。young generation: 生命週期很短的對象,歸爲young generation。因爲生命週期很短,這部分對象在gc的時候,很大部分的對象已經成爲非活動對象。所以針對young generation的對象,採用copy算法,只須要將少許的存活下來的對象copy到to space。存活的對象數量越少,那麼copy算法的效率越高。 young generation的gc稱爲minor gc。通過數次minor gc,依舊存活的對象,將被移出young generation,移到tenured generation(下面將會介紹)young generation分爲: eden:每當對象建立的時候,老是被分配在這個區域 survivor1:copy算法中的from space survivor2:copy算法中的to sapce (備註:其中survivor1和survivor2的身份在每次minor gc後被互換) minor gc的時候,會把eden+survivor1(2)的對象copy到survivor2(1)去。 tenured generation: 生命週期較常的對象,納入到tenured generation。通常是通過屢次minor gc,還 依舊存活的對象,將移入到tenured generation。(固然,在minor gc中若是存活的對象的超過survivor的容量,放不下的對象會直接移入到tenured generation) tenured generation的gc稱爲major gc,就是一般說的full gc。採用compactiion算法。因爲tenured generaion區域比較大,並且一般對象生命週期都比較常,compaction須要必定時間。因此這部分的gc時間比較長。 minor gc可能引起full gc。當eden+from space的空間大於tenured generation區的剩餘空間時,會引起full gc。這是悲觀算法,要確保eden+from space的對象若是都存活,必須有足夠的tenured generation空間存放這些對象。 Permanet Generation: 該區域比較穩定,主要用於存放classloader信息,好比類信息和method信息。 對於spring hibernate這些須要動態類型支持的框架,這個區域須要足夠的空間。 這部份內容相對比較理論,能夠結合jstat,jmap等命令(固然也可使用jconsole,jprofile,gciewer等工具),觀察jdk gc的狀況
相關文章
相關標籤/搜索