Java教程學習入門影片原始碼課件:JVM調優講解

千鋒雲端計算發表於2020-02-29

JVM是最好的軟體工程之一,它為Java提供了堅實的基礎,許多流行語言如Kotlin、Scala、Clojure、Groovy都使用JVM作為執行基礎。一個專業的Java工程師必須要了解並掌握JVM,接下來千鋒給大家分享Java基礎知識中JVM調優相關知識點。

Java教程學習入門影片原始碼課件:JVM調優講解

JVM常見的調優引數包括:

-Xmx:指定java程式的最大堆記憶體, 使用java -Xmx5000M -version判斷當前系統能分配的最大堆記憶體;

-Xms:指定最小堆記憶體, 通常設定成跟最大堆記憶體一樣,減少GC;

-Xmn:設定年輕代大小。整個堆大小=年輕代大小+年老代大小。所以增大年輕代後,將會減小年老代大小。此值對系統效能影響較大,Sun官方推薦配置為整個堆的3/8;

-Xss:指定執行緒的最大棧空間, 此引數決定了java函式呼叫的深度, 值越大呼叫深度越深, 若值太小則容易出棧溢位錯誤(StackOverflowError);

-XX:PermSize:指定方法區(永久區)的初始值,預設是實體記憶體的1/64,在Java8永久區移除, 代之的是後設資料區,由-XX:MetaspaceSize指定;

-XX:MaxPermSize:指定方法區的最大值, 預設是實體記憶體的1/4,在java8中由-XX:MaxMetaspaceSize指定後設資料區的大小;

-XX:NewRatio=n:年老代與年輕代的比值,-XX:NewRatio=2, 表示年老代與年輕代的比值為2:1;

-XX:SurvivorRatio=n:Eden區與Survivor區的大小比值,-XX:SurvivorRatio=8表示Eden區與Survivor區的大小比值是8:1:1,因為Survivor區有兩個(from, to)。

Java教程學習入門影片原始碼課件:JVM調優講解

JVM實質上分為三大塊,年輕代(YoungGen),年老代(Old Memory),及持久代(Perm,在Java8中被取消)。

年輕代大小選擇

響應時間優先的應用:儘可能設大,直到接近系統的最低響應時間限制(根據實際情況選擇)。在此種情況下,年輕代收集發生的頻率也是最小的。同時,減少到達年老代的物件。

吞吐量優先的應用:儘可能的設定大,可能到達Gbit的程度。因為對響應時間沒有要求,垃圾收集可以並行進行,一般適合8CPU以上的應用。

年老代大小選擇

響應時間優先的應用:年老代使用併發收集器,所以其大小需要小心設定,一般要考慮併發會話率和會話持續時間等一些引數。如果堆設定小了,可以會造成記憶體碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。最最佳化的方案,一般需要參考以下資料獲得:併發垃圾收集資訊、持久代併發收集次數、傳統GC資訊、花在年輕代和年老代回收上的時間比例。

減少年輕代和年老代花費的時間,一般會提高應用的效率。

吞吐量優先的應用:一般吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以儘可能回收掉大部分短期物件,減少中期的物件,而年老代盡存放長期存活物件。

Java教程學習入門影片原始碼課件:JVM調優講解

較小堆引起的碎片問題

因為年老代的併發收集器使用標記、清除演算法,所以不會對堆進行壓縮。當收集器回收時,他會把相鄰的空間進行合併,這樣可以分配給較大的物件。但是,當堆空間較小時,執行一段時間以後,就會出現“碎片”,如果併發收集器找不到足夠的空間,那麼併發收集器將會停止,然後使用傳統的標記、清除方式進行回收。如果出現“碎片”,可能需要進行如下配置:

-XX:+UseCMSCompactAtFullCollection:使用併發收集器時,開啟對年老代的壓縮。

-XX:CMSFullGCsBeforeCompaction=0:上面配置開啟的情況下,這裡設定多少次Full GC後,對年老代進行壓縮。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69916964/viewspace-2677828/,如需轉載,請註明出處,否則將追究法律責任。

相關文章