Jvm知識學習(五)-GC參數

一,JAVA堆
Java 堆是被所有線程共享的一塊內存區域,在虛擬機啓動時創建。這個區域是用來存放對象實例的,幾乎所有對象實例都會在這裏分配內存。堆是Java垃圾收集器管
的主要區域(GC堆),垃圾收集器實現了對象的自動銷燬。Java堆可以細分爲:新生代和老年代;再細緻一點的有Eden空間,From Survivor空間,To Survivor空間
等。Java堆可以處於物理上不連續的內存空間中,只要邏輯上是連續的即可,就像我們的磁盤空間一樣。可以通過-Xmx和-Xms控制
二,串行收集器
(1)最古老,最穩定
(2)效率高
(3)可能會產生較長的停頓
(4)-XX:+UseSerialGC
   新生代、老年代使用串行回收 
   新生代複製算法 
   老年代標記-壓縮 
使用示例圖:

三,並行收集器
1,ParNew收集器
(1)參數:-XX:+UseParNewGC
         新生代並行 
        老年代串行 
(2)Serial收集器新生代的並行版本
(3)複製算法
(4)多線程,需要多核支持
(5)-XX:ParallelGCThreads:限制線程數量
使用示例圖:

2,Parallel收集器
(1)參數:-XX:+UseParallelGC(使用Parallel收集器+ 老年代串行)        
      類似ParNew
      新生代複製算法
      老年代 標記-壓縮
      更加關注吞吐量
(2)參數:-XX:+UseParallelOldGC(使用Parallel收集器+ 並行老年代
使用示例圖:

並行收集器參數:
-XX:MaxGCPauseMills :最大停頓時間,單位毫秒 ,GC盡力保證回收時間不超過設定值 
-XX:GCTimeRatio :0-100的取值範圍,垃圾收集時間佔總時間的比 ,默認99,即最大允許1%時間做GC 
這兩個參數是矛盾的:GC很頻繁,最大停頓時間變短,吞吐量變小,GC很少,最大停頓時間變長,吞吐量增大。

因此停頓時間和吞吐量不可能同時調優 


三,CMS收集器
CMS收集器:Concurrent Mark Sweep 併發(與用戶進程一起執行)標記清除,使用標記-清除算法,併發階段會降低吞吐量,老年代收集器(新生代使用ParNew)。
參數:-XX:+UseConcMarkSweepGC

CMS運行過程比較複雜,着重實現了標記的過程,可分爲
(1)初始標記 :根可以直接關聯到的對象,速度快。 
(2)併發標記(和用戶線程一起) :主要標記過程,標記全部對象 
(3)重新標記 :由於併發標記時,用戶線程依然運行,因此在正式清理前,再做修正 
(4)併發清除(和用戶線程一起) :基於標記結果,直接清理對象 
使用示例圖:
CMS收集器特點 :
(1)儘可能降低停頓
(2)會影響系統整體吞吐量和性能
    比如,在用戶線程運行過程中,分一半CPU去做GC,系統性能在GC階段,反應速度就下降一半
(3)清理不徹底
   因爲在清理階段,用戶線程還在運行,會產生新的垃圾,無法清理
    因爲和用戶線程一起運行,不能在空間快滿時再清理
(4)-XX:CMSInitiatingOccupancyFraction設置觸發GC的閾值
如果不幸內存預留空間不夠,就會引起concurrent mode failure
如下圖:

碎片:當進行標記清除時,會產生一定量的內存碎片。
CMS收集器參數:
-XX:+ UseCMSCompactAtFullCollection: Full GC後,進行一次整理 ,
整理過程是獨佔的,會引起停頓時間變長 
-XX:+CMSFullGCsBeforeCompaction: 
設置進行幾次Full GC後,進行一次碎片整理 
-XX:ParallelCMSThreads :
設定CMS的線程數量 

四,GC參數整理
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:設置eden區大小和survivior區大小的比例
-XX:NewRatio:新生代和老年代的比
-XX:+UseParNewGC:在新生代使用並行收集器
-XX:+UseParallelGC :新生代使用並行回收收集器
-XX:+UseParallelOldGC:老年代使用並行回收收集器
-XX:ParallelGCThreads:設置用於垃圾回收的線程數
-XX:+UseConcMarkSweepGC:新生代使用並行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:設定CMS的線程數量
-XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少後觸發
-XX:+UseCMSCompactAtFullCollection:設置CMS收集器在完成垃圾收集後是否要進行一次內存碎片的整理
-XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次內存壓縮
-XX:+CMSClassUnloadingEnabled:允許對類元數據進行回收
-XX:CMSInitiatingPermOccupancyFraction:當永久區佔用率達到這一百分比時,啓動CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到達閥值的時候,才進行CMS回收

五,Tomcat實例演示
環境 :Tomcat 7,JSP 網站
工具 :JMeter 
目的 :測試網站吞吐量和延時,讓Tomcat有一個不錯的吞吐量 
系統結構:


示例1:


示例2:

示例3:

示例4:

示例5:

示例6:

示例7:

示例8:

示例9:與示例8相比,jdk的升級可以提升性能。

總結:



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