雙核,4個cores; 16G memoryjava
[root@alish2-cassandra-01 ~]# cat /proc/cpuinfo | grep "cpu cores" cpu cores : 2 cpu cores : 2
響應時間優先的併發收集器,主要是保證系統的響應時間,減小垃圾收集時的停頓時間。適用於應用服務器、電信領域等。算法
ParNew收集器tomcat
ParNew收集器是Serial收集器的多線程版本,許多運行在Server模式下的虛擬機中首選的新生代收集器,除Serial外,只有它能與CMS收集器配合工做。服務器
CMS收集器多線程
CMS, 全稱Concurrent Low Pause Collector,是jdk1.4後期版本開始引入的新gc算法,在jdk5和jdk6中獲得了進一步改進,它的主要適合場景是對響應時間的重要性需求 大於對吞吐量的要求,可以承受垃圾回收線程和應用線程共享處理器資源,而且應用中存在比較多的長生命週期的對象的應用。CMS是用於對tenured generation的回收,也就是年老代的回收,目標是儘可能減小應用的暫停時間,減小FullGC發生的概率,利用和應用程序線程併發的垃圾回收線程來 標記清除年老代。
CMS並不是沒有暫停,而是用兩次短暫停來替代串行標記整理算法的長暫停,它的收集週期是這樣:
初始標記(CMS-initial-mark) -> 併發標記(CMS-concurrent-mark) -> 從新標記(CMS-remark) -> 併發清除(CMS-concurrent-sweep) ->併發重設狀態等待下次CMS的觸發(CMS-concurrent-reset)
其中的1,3兩個步驟須要暫停全部的應用程序線程的。第一次暫停從root對象開始標記存活的對象,這個階段稱爲初始標記;第二次暫停是在併發標記以後,暫停全部應用程序線程,從新標記併發標記階段遺漏的對象(在併發標記階段結束後對象狀態的更新致使)。第一次暫停會比較短,第二次暫停一般會比較長,而且remark這個階段能夠並行標記。
而併發標記、併發清除、併發重設階段的所謂併發,是指一個或者多個垃圾回收線程和應用程序線程併發地運行,垃圾回收線程不會暫停應用程序的執行,若是你有多於一個處理器,那麼併發收集線程將與應用線程在不一樣的處理器上運行,顯然,這樣的開銷就是會下降應用的吞吐量。Remark階段的並行,是指暫停了全部應用程序後,啓動必定數目的垃圾回收進程進行並行標記,此時的應用線程是暫停的。併發
($TOMCAT_HOME/bin/catalina.sh)jvm
export JAVA_OPTS="-server -Xmx10240m -Xms10240m -Xmn3840m -XX:PermSize=256m -XX:MaxPermSize=256m -Denv=denalicnprod -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=1048576 -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:ParallelGCThreads=10 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:ParallelCMSThreads=10 -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseFastAccessorMethods -XX:LargePageSizeInBytes=128M -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -Xloggc:gc.log -verbose:gc"
參 數 | 含 義 |
---|---|
-server | 必定要做爲第一個參數,啓用JDK的server版本,在多個CPU時性能佳 |
-Xms | java Heap初始大小。 默認是物理內存的1/64。此值能夠設置與-Xmx相同,以免每次垃圾回收完成後JVM從新分配內存。 |
-Xmx | java heap最大值。建議均設爲物理內存的80%。不可超過物理內存。 |
-Xmn | 設置年輕代大小,通常設置爲Xmx的2/8~3/8,等同於-XX:NewSize 和 -XX:MaxNewSize 。 |
-XX:PermSize | 設定內存的永久保存區初始大小,缺省值爲64M |
-XX:MaxPermSize | 設定內存的永久保存區最大大小,缺省值爲64M |
-Denv | 指定tomcat運行哪一個project |
-XX:SurvivorRatio | Eden區與Survivor區的大小比值, 設置爲8,則兩個Survivor區與一個Eden區的比值爲2:8,一個Survivor區佔整個年輕代的1/10 |
-XX:PretenureSizeThreshold | 晉升年老代的對象大小。默認爲0,好比設爲1048576(1M),則超過1M的對象將不在eden區分配,而直接進入年老代。 |
-XX:+DisableExplicitGC | 關閉System.gc() |
-XX:+UseParNewGC | 設置年輕代爲併發收集。可與CMS收集同時使用。 |
-XX:ParallelGCThreads | |
-XX:+UseConcMarkSweepGC | 設置年老代爲併發收集。測試中配置這個之後,-XX:NewRatio=4的配置失效了。因此,此時年輕代大小最好用-Xmn設置。 |
-XX:+CMSParallelRemarkEnabled | 開啓並行remark |
-XX:+CMSScavengeBeforeRemark | 這個參數還蠻重要的,它的意思是在執行CMS remark以前進行一次youngGC,這樣能有效下降remark的時間 |
-XX:ParallelCMSThreads | CMS默認啓動的回收線程數目是 (ParallelGCThreads + 3)/4) ,若是你須要明確設定,能夠經過-XX:ParallelCMSThreads=20來設定,其中ParallelGCThreads是年輕代的並行收集線程數 |
-XX:CMSInitiatingOccupancyFraction | 使用cms做爲垃圾回收使用70%後開始CMS收集 |
-XX:+UseCMSInitiatingOccupancyOnly | 使用手動定義初始化定義開始CMS收集 |
-XX:+UseCMSCompactAtFullCollection | 打開對年老代的壓縮。可能會影響性能,可是能夠消除內存碎片。 |
-XX:CMSFullGCsBeforeCompaction | 因爲併發收集器不對內存空間進行壓縮、整理,因此運行一段時間之後會產生「碎片」,使得運行效率下降。此參數設置運行次FullGC之後對內存空間進行壓縮、整理。 |
-XX:+CMSPermGenSweepingEnabled | 爲了不Perm區滿引發的full gc,建議開啓CMS回收Perm區選項 |
-XX:+CMSClassUnloadingEnabled | |
-XX:+UseFastAccessorMethods | 原始類型的快速優化 |
-XX:LargePageSizeInBytes | 內存頁的大小,不可設置過大, 會影響Perm的大小 |
-XX:SoftRefLRUPolicyMSPerMB | 「軟引用」的對象在最後一次被訪問後能存活0毫秒(默認爲1秒)。 |
-XX:+PrintGCDetails | 記錄 GC 運行時的詳細數據信息,包括新生成對象的佔用內存大小以及耗費時間等 |
-XX:+PrintGCTimeStamps | 打印垃圾收集的時間戳 |
-XX:+PrintHeapAtGC | 打印GC先後的詳細堆棧信息 |
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期間程序暫停的時間.可與上面混合使用 |
-XX:+PrintGCDateStamps | 以前打印gc日誌的時候使用是:-XX:+PrintGCTimeStamps,這個選項記錄的是jvm啓動時間爲起點的相對時間,可讀性較差,不利於定位問題,使用PrintGCDateStamps記錄的是系統時間,更humanreadable |
-Xloggc | 與上面幾個配合使用,把相關日誌信息記錄到文件以便分析 |
-verbose:gc | 記錄 GC 運行以及運行時間,通常用來查看 GC 是不是應用的瓶頸 |