深入JVM之——GC種類和實踐

                

          首先,合理的配置GC收集器是開發一個高性能服務器的重要參數。現在讓我們先來認識幾個重要的GC收集器,然後帶着大家來實踐一下。

         一、 GC收集器按工作特性分類大致可分爲3類:

          (1)serial collector :單線程收集器,使用單線程去完成所有的gc工作,沒有線程間的通信,這種方式會相對高效,單處理器機器且沒有pause time的要求。Client模式下默認可使用 。可用-XX:+UseSerialGC強制使用。優點:對server應用沒什麼優點。缺點:慢,不能充分發揮硬件資源

           (2)parallel collector:並行收集器。使用多線程的方式,利用多CUP來提高GC的效率。主要以到達一定的吞吐量爲目標。適用於科學技術和後臺處理有中規模/大規模數據集大小的應用且運行在多處理器上,關注吞吐量(throughput)。可用-XX:+UseParallelGC或-XX:+UseParallelOldGC強制指定。--ParallelGC代表FGC爲Parallel MSC --ParallelOldGC代表FGC爲Parallel Compacting 優點:高效 缺點:當heap變大後,造成的暫停時間會變得比較長

      (3)concurrent collector:併發收集器。使用多線程的方式,利用多CUP來提高GC的效率。併發完成大部分工作,使得gc pause短。適合中規模/大規模數據集大小的應用,應用服務器,電信領域關注response time,而不是throughpu。可用-XX:+UseConcMarkSweepGC強制指定 優點:對old進行回收時,對應用造成的暫停時間非常端,適合對latency要求比較高的應用缺點:1.內存碎片和浮動垃圾2.old去的內存分配效率低3.回收的整個耗時比較長4.和應用爭搶CPU

       注:想必單線程大家都能理解,我來解釋一下。並行收集器和併發收集器的區別,並行表示開啓多個GC線程去回收垃圾對象,但是回收過程中應用程序依然會停頓。總得來講它只是單線程收集器改良的多線程版。而併發收集器允許GC線程和應用程序線程同時執行,所以併發收集器相對前兩種收集器來說算法比較複雜。

            二、三種收集器的實驗分別如下

              serial collector :

                             -XX:+UseSerialGC  新老代全是用串行回收

              parallel collector:

                -XX:+UseParNewGC 多線程收集。可與CMS收集同時使用。在serial基礎上實現的多線程收集器。在收集器只對年輕代有效。但此時用戶線程必須停止

                                     -XX:+UseParallelGC:垃圾收集器爲並行收集器。此配置僅對年輕代有效。可以同時並行多個垃圾收集線程,但此時用戶線程必須停止。 -XX:+UseParallelGC-XX:+UseParNewGC最大的不同是後者可與CMS配合使用。

                                                  -XX:+UseParallelOldGC:這個是老年代使用並行收集器。

            concurrent collector

              -XX:+UseConcMarkSweepGC:併發收集器的實現,針對老年代。算法複雜。工作中會分一半CPU去工作,雖然不會停頓應用線程,但是會

    三、實驗測試。

                  目的:測試網頁吞吐量

              環境:tomcat7 JSP網站

              工具:JMeter

              方式:建立10個線程,每個線程請求Tomcat 1000次 共10000次請求

           (1)JDK6:使用32M堆處理請求
參數:set CATALINA_OPTS=-server -Xloggc:gc.log -XX:+PrintGCDetails -Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseSerialGC -XX:PermSize=32M

結論:因爲堆只有32M,所以FullGC頻繁執行

          (2)set CATALINA_OPTS=-Xmx512m -XX:MaxPermSize=32M  -Xloggc:gc.log -XX:+PrintGCDetails


結論:增大堆空間後明顯改善Full GC的執行次數。但新生代 的GC依然很多。新生代空間也從初始的15872k增大到60456k說明GC要維持最小堆空間所以纔不斷的執行以逐漸增加堆空間來供給程序的開銷。


       (3)set CATALINA_OPTS=-Xmx512m -Xms64m -XX:MaxPermSize=32M  -Xloggc:gc.log -XX:+PrintGCDetails



結論: GC數量減少 且性能有略微提升

        (4)set CATALINA_OPTS=-Xmx512m -Xms64m -XX:MaxPermSize=32M  -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4



結論:GC壓力原本就不大,改用並行回收器之後反而略微影響了性能。


          (5)減小堆大小,增加GC壓力,使用Serial回收器set CATALINA_OPTS=-Xmx40m -Xms40m -XX:MaxPermSize=32M  -Xloggc:gc.log -XX:+PrintGCDetails

結論:當我們減小堆大小後,使用默認回收器.間接增大了GC壓力,我們發現性能下降還是比較明顯的。


        (6)減小堆大小,增加GC壓力,使用ParNew回收器set CATALINA_OPTS=-Xmx40m -Xms40m -XX:MaxPermSize=32M  -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseParNewGC

結論:當我們在年輕代改用 -XX:+UseParNewGC後我們發現,性能提升。MAX明顯變小

          (7)JDK測試

 啓動Tomcat 7 使用JDK6 不加任何參數啓動測試

  啓動Tomcat 7  使用JDK7  不加任何參數啓動測試

結論:升級JDK可能會帶來額外的性能提升!不要忽視JDK的版本哦

細節決定成敗。性能的根本在應用,GC參數屬於微調。設置不合理,會影響性能,產生大的延時

注:配置-XX:ParallelGCThreads具體要多CPU核心數,不是越多越好。最後設置CPU核心的數量。
最後祝大家早日成爲大牛!!!

 




發佈了13 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章