堆棧:算法
【堆】 -Xms 初始堆大小,默認空餘堆內存小於40%(MinHeapFreeRatio參數能夠調整)時,JVM就會增大堆直到-Xmx的最大限制。 -Xmx 最大堆大小,默認空餘堆內存大於70%(MaxHeapFreeRatio參數能夠調整)時,JVM會減小堆直到-Xms的最小限制。 -Xmn 新生代大小: 1>新生代越大也就意味着會有更多的對象在minor GC期間被回收,若是設置的太大,則老年代就變小了,可能會頻繁觸發Full GC,甚至是OOM。 2>若是新生代設置的過小,則會致使minor GC更加頻繁,進而會致使更多的對象直接進入老年代,當老年代已使用的空間到達必定比例時,會觸發Full GC。 -XX:NewSize 設置新生代大小 -XX:NewRatio 新生代(Eden+2個Survivor)與老年代的比值 -XX:SurvivorRatio 設置Eden與1個Survivor的比值,默認爲8,即 Eden : Survivor1 : Survivor2 = 8:1:1 1>Eden越大也就意味着發生minor GC的頻率越低,若是Eden設置的太大,形成Survivor過小,則會致使要回收的對象在minor GC後就直接進入老年代,從而更頻繁地觸發Full GC。 【棧】 -Xss 每一個線程的棧大小: 1>在相同物理內存下:減少這個值能生成更多的線程,可是操做系統對一個進程內的線程數是有限制的,不能無限生成(網上說是3k-5k左右,沒有作過測試)。 2>通常比較小的系統,若是棧不是很深,則128k就夠用了,較大的系統則應設置爲256k。 3>jdk5以後,每一個線程堆棧大小默認爲1M。 【永久代】 -XX:PermSize 設置永久代初始值 -XX:MaxPermSize 設置持久代最大值 【其它】 -XX:+TraceClassLoading 跟蹤類加載和卸載的信息,通常咱們在排查內存泄露、jar包版本衝突等問題時會添加這個參數。 -XX:LargePageSizeInBytes=128 設置內存頁的大小 -XX:MaxTenuringThreshold GC最大年齡 1>若是設置爲0,則新生代對象不通過Survivor區,直接進入老年代。對於老年代中對象比較多的應用,能夠提升效率。 2>若是設置爲一個較大的值,則新生代對象會在Survivor區進行屢次複製,這樣能夠增長對象在新生代的存活時間,增長對象在新生代被回收的機率,該參數只有在串行GC時纔有效。
GC收集器:jvm
ParNew收集器: -XX:+UseParNewGC 設置新生代的收集器爲ParNew收集器(並行收集器)。該設置默認是關閉的,打開該開關後,jvm會使用 ParNew + Serial Old 來進行gc。 -XX:ParallelGCThreads 並行收集器的線程數,此值建議設置爲處理器的個數。 CMS收集器: -XX:+UseConcMarkSweepGC 設置老年代的收集器爲CMS收集器。 -XX:+CMSParallelRemarkEnabled 開啓並行remark,以減小remark時程序暫停的時間。 -XX:CMSInitiatingOccupancyFraction=70 當老年代的空間被佔用70%後,CMS收集器開始gc。 1>JVM會收集對象分配和釋放的運行時數據,而且經過分析這些數據來決定何時應該進行一次gc(即:啓動一次CMS垃圾收集器)。 2>爲了引導這一過程,JVM會在啓動CMS收集器前進行一些線索查找,該線索由-XX:CMSInitiatingOccupancyFraction來設置,該值表示老年代的使用率。 -XX:+UseCMSInitiatingOccupancyOnly 命令JVM不要根據運行時收集的數據來判斷何時開始gc,而是根據CMSInitiatingOccupancyFraction的值來判斷是否進行CMS收集。注意:通常不會打開該開關。 -XX:+UseCMSCompactAtFullCollection CMS收集器在gc時,容許對老年代進行壓縮,解決因標記-清除算法致使的內存碎片的問題。 -XX:CMSFullGCsBeforeCompaction=0 CMS收集器gc多少次後進行內存壓縮(整理),因爲CMS收集器使用的是標記-清除算法,因此CMS在gc後會產生內存碎片,使得運行效率下降。 -XX:+CMSClassUnloadingEnabled 開啓CMS收集器對永久代的gc(默認不會對永久代進行gc)。 -XX:CMSInitiatingPermOccupancyFraction 設置永久代使用到達多少比率時觸發CMS收集器的gc -XX:+DisableExplicitGC 禁止System.gc(),避免因開發人員不恰當地調用System.gc()方法對系統性能形成的不良的影響。 -Xnoclassgc 禁用類垃圾回收功能,也就避免了同一個類的加載、卸載、(再次用到該類時)再加載的操做,性能會高一點。 1>虛擬機加載類的過程當中包含了IO和內存分配等操做,故JVM在加載類時會對性能產生必定的影響。 -XX:+UseFastAccessorMethods 優化原始類型的getter方法的性能,默認開啓。 -XX:+PrintClassHistogram 遇到Ctrl+Break中斷,打印類實例的柱狀信息,與jmap -histo功能相同 -XX:SoftRefLRUPolicyMSPerMB=0 設置每兆堆空閒空間中軟引用(SoftReference)的存活時間,默認值爲1(秒)。 1>softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap. 2>SoftReference是在gc時才被回收,故SoftReference實際的存活時間可能比這個設定的值要大。 3>通常狀況下,建議設置爲0。
輔助信息:性能
-XX:+PrintGCDetails 打印GC的詳細信息 -XX:+PrintGCTimeStamps 打印GC的時間戳 -XX:+PrintHeapAtGC 打印GC先後堆棧的詳細信息 -Xloggc: 設置gc的log日誌。eg:-Xloggc:$CATALINA_BASE/logs/gc.log
補充: -XX:CMSInitiatingOccupancyFraction與-Xmn之間的關係:測試
內存分配擔保失敗(promontion faild)的緣由: 1)Minor GC時,將eden和survivor from中存活的對象複製到survivor to中的時候,若是survivor to容納不下這些對象,那麼這些對象將晉升到老年代, 2)此時,若是老年代中剩餘的空間也沒法容納下這些對象,那麼就會致使內存分配擔保失敗(promontion faild),進而引起了full gc。 結論:當新生代與老年代知足 eden + survivor from <= 老年代剩餘的空間 關係時,promontion faild就不會發生。 即:eden + survivor from <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100) 由方程組: Eden / Survivor=SurvivorRatio Eden + 2Survivor=Xmn Survivor * SurvivorRatio + 2Survivor = Xmn ===> Survivor = Xmn/(SurvivorRatio+2) 可得出: Eden + Survivor = Xmn-Survivor = Xmn - Xmn/(SurvivorRatio+2) 即:Xmn - Xmn/(SurvivorRatio+2) <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100) 簡化: CMSInitiatingOccupancyFraction <= (1 - (Xmn-Xmn/(SurvivorRatio+2))/(Xmx-Xmn)) * 100 eg:若是 -Xms8G -Xmx8G -Xmn3G -XX:SurvivorRatio=8,則 CMSInitiatingOccupancyFraction <= (1 - (3-3/(8+2))/(8-3))) = 46% CMSInitiatingOccupancyFraction低於70% 須要調整xmn或SurvivorRatior值。
===================================================================================優化
網上某大牛的配置,據稱能夠支持天天幾百萬的pv。操作系統
JAVA_OPTS=" -Dresin.home=$SERVER_ROOT -server -Xms6000M -Xmx6000M -Xmn500M -XX:PermSize=500M -XX:MaxPermSize=500M -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=90 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log" 說明: 1)-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 表示在新生代中去掉了Survivor,即新生代中只有Eden
===================================================================================線程