參考: https://www.cnblogs.com/jpfss/p/9753215.html
推薦閱讀:
總結: 百萬連接,百億吞吐量服務的JVM性能調優實戰 >>https://my.oschina.net/LucasZhu/blog/2056232
最后,對於長連接,push一類的海量服務端應用,16G內存8核心,推薦的JVM參數如下 jdk 1.7 14g->13g
-Xms13g -Xmx13g -Xss512k -XX:PermSize=384m -XX:MaxPermSize=384m -XX:NewSize=12g -XX:MaxNewSize=12g -XX:SurvivorRatio=18 -XX:MaxDirectMemorySize=2g -XX:+UseParNewGC -XX:ParallelGCThreads=4
-XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70 -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=9 -XX:+CMSClassUnloadingEnabled
-XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC -Xloggc:/data/applogs/heap_trace.txt -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/HeapDumpOnOutOfMemoryError
JDK1.8
-Xms13g -Xmx13g -Xss512k -XX:MetaspaceSize=384m -XX:MaxMetaspaceSize=384m -XX:NewSize=11g -XX:MaxNewSize=11g -XX:SurvivorRatio=18 -XX:MaxDirectMemorySize=2g -XX:+UseParNewGC
-XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC
-XX:+CMSScavengeBeforeRemark -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0
-XX:-ReduceInitialCardMarks -XX:+CMSClassUnloadingEnabled -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC -Xloggc:/data/applogs/heap_trace.txt -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/HeapDumpOnOutOfMemoryError
這樣可以保證大多數對象在new區域就銷毀,並且到了old區,remark之前先yong gc,然后再來一次cms old gc,將old gc控制在毫秒級別
執行啟動設置Jvm參數的操作。
java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC myApp-1.0.0.jar
關於這些設置的JVM參數是什么意思,請參考第二步中的oracle官方給出的調優文檔。
我在這邊簡單說一下:
-XX:MetaspaceSize=128m (元空間默認大小)
-XX:MaxMetaspaceSize=128m (元空間最大大小)
-Xms1024m (堆最大大小)
-Xmx1024m (堆默認大小)
-Xmn256m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分區比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,這里使用CMS收集器)
-XX:+PrintGCDetails (打印詳細的GC日志)
知識點:
JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是
-XX:MetaspaceSize=128m (元空間默認大小)
-XX:MaxMetaspaceSize=128m (元空間最大大小)
JDK 8開始把類的元數據放到本地化的堆內存(native heap)中,這一塊區域就叫Metaspace,中文名叫元空間。
使用本地化的內存有什么好處呢?最直接的表現就是java.lang.OutOfMemoryError: PermGen 空間問題將不復存在,因為默認的類的元數據分配只受本地內存大小的限制,也就是說本地內存剩余多少,理論上Metaspace就可以有多大(貌似容量還與操作系統的虛擬內存有關?這里不太清楚),這解決了空間不足的問題。不過,讓Metaspace變得無限大顯然是不現實的,因此我們也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize參數來指定Metaspace區域的大小。JVM默認在運行時根據需要動態地設置MaxMetaspaceSize的大小。
GC模式 G1中提供了三種模式垃圾回收模式,young gc、mixed gc 和 full gc,在不同的條件下被觸發。 young gc 發生在年輕代的GC算法,一般對象(除了巨型對象)都是在eden region中分配內存,當所有eden region被耗盡無法申請內存時,就會觸發一次young gc,這種觸發機制和之前的young gc差不多,執行完一次young gc,活躍對象會被拷貝到survivor region或者晉升到old region中,空閑的region會被放入空閑列表中,等待下次被使用。 參數 含義 -XX:MaxGCPauseMillis 設置G1收集過程目標時間,默認值200ms -XX:G1NewSizePercent 新生代最小值,默認值5% -XX:G1MaxNewSizePercent 新生代最大值,默認值60% mixed gc 當越來越多的對象晉升到老年代old region時,為了避免堆內存被耗盡,虛擬機會觸發一個混合的垃圾收集器,即mixed gc,該算法並不是一個old gc,除了回收整個young region,還會回收一部分的old region,這里需要注意:是一部分老年代,而不是全部老年代,可以選擇哪些old region進行收集,從而可以對垃圾回收的耗時時間進行控制。 那么mixed gc什么時候被觸發? 先回顧一下cms的觸發機制,如果添加了以下參數: -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly 當老年代的使用率達到80%時,就會觸發一次cms gc。相對的,mixed gc中也有一個閾值參數 -XX:InitiatingHeapOccupancyPercent,當老年代大小占整個堆大小百分比達到該閾值時,會觸發一次mixed gc. mixed gc的執行過程有點類似cms,主要分為以下幾個步驟: initial mark: 初始標記過程,整個過程STW,標記了從GC Root可達的對象 concurrent marking: 並發標記過程,整個過程gc collector線程與應用線程可以並行執行,標記出GC Root可達對象衍生出去的存活對象,並收集各個Region的存活對象信息 remark: 最終標記過程,整個過程STW,標記出那些在並發標記過程中遺漏的,或者內部引用發生變化的對象 clean up: 垃圾清除過程,如果發現一個Region中沒有存活對象,則把該Region加入到空閑列表中 full gc 如果對象內存分配速度過快,mixed gc來不及回收,導致老年代被填滿,就會觸發一次full gc,G1的full gc算法就是單線程執行的serial old gc,會導致異常長時間的暫停時間,需要進行不斷的調優,盡可能的避免full gc. 鏈接:https://www.jianshu.com/p/0f1f5adffdc1
