關於線上JVM動態參數設置調優


當你在網上興沖沖找到一個可優化的參數時,先用-XX: +PrintFlagsFinal看看,它可能已經默認打開了,再找到一個,還是默認打開了...

JDK7與JDK8,甚至JDK7中的不同版本,有些參數值都不一樣,所以不要輕信網上任何文章,一切以生產環境同版本的JDK打出來的為准。

經常以類似下面的語句去查看參數,偷懶不起應用,用-version代替。有些參數設置后會影響其他參數,所以查看時也把它帶上。

 java -server -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep ParallelGCThreads

 筆者環境打印:

java -server -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep ParallelGCThreads
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
uintx ParallelGCThreads = 4 {product}
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

1.1 取消偏向鎖 -XX:-UseBiasedLocking

JDK1.6開始默認打開的偏向鎖,會嘗試把鎖賦給第一個訪問它的線程,取消同步塊上的synchronized原語。如果始終只有一條線程在訪問它,就成功略過同步操作以獲得性能提升。

但一旦有第二條線程訪問這把鎖,JVM就要撤銷偏向鎖恢復到未鎖定線程的狀態,詳見 JVM的Stop The World,安全點,黑暗的地底世界, 可以看到不少RevokeBiasd的紀錄,像GC一樣,會Stop The World的干活,雖然只是很短很短的停頓,但對於多線程並發的應用,取消掉它反而有性能的提升和延時的極微的縮短,所以Cassandra就取消了它。

 

1.2 -XX:AutoBoxCacheMax=20000

Integer i = 3;這語句有着 int自動裝箱成Integer的過程,JDK默認只緩存 -128 ~ +127的int 和 long,超出范圍的數字就要即時構建新的Integer對象。設為20000后,我們應用的QPS從48,000提升到50,000,足足4%的影響。詳見Java Integer(-128~127)值的==和equals比較產生的思考

 

1.3 啟動時訪問並置零內存頁面-XX:+AlwaysPreTouch

啟動時就把參數里說好了的內存全部舔一遍,可能令得啟動時慢上一點,但后面訪問時會更流暢,比如頁面會連續分配,比如不會在晉升新生代到老生代時才去訪問頁面使得GC停頓時間加長。不過這選項對大堆才會更有感覺一點。

 

1.4 -XX:+PerfDisableSharedMem

Cassandra家的一個參數,一直沒留意,直到發生高IO時的JVM停頓。原來JVM經常會默默的在/tmp/hperf 目錄寫上一點statistics數據,如果剛好遇到PageCache刷盤,把文件阻塞了,就不能結束這個Stop the World的安全點了。用此參數可以禁止JVM寫statistics數據,代價是jps, jstat 用不了,只能用JMX取數據。有時用JMX取新生代老生代使用百分比還真沒jstat方便。詳見The Four Month Bug: JVM statistics cause garbage collection pauses

 

1.5 -Djava.security.egd=file:/dev/./urandom

此江湖偏方原用於Tomcat顯式使用SHA1PRNG算法時,初始因子從/dev/random讀取導致堵塞。而使用此設置后,額外效果是默認的SecureRandom算法也變成SHA1了。 SHA1PRNG 比 NativePRNG消耗小一半,synchronized的代碼少一半,所以沒特殊安全要求的話建議用SHA1。詳見 SecureRandom的江湖偏方與真實效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM