天天看點

JVM 參數調優配置

在 tomcat 配置檔案 tomcat/bin/catalina.sh 中 配置  JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=1024m"。在配置檔案第一行進行配置。

注意:-server 一定要作為第一個參數,在多個CPU時性能佳。

-Xms:設定JVM初始配置設定的堆記憶體為2048m,初始Heap大小,使用的最小記憶體,cpu性能高時此值應設的大一些,cpu性能高時此值應設的大一些。預設是實體記憶體的1/64。等價于 -XX:InitialHeapSize

-Xmx:設定JVM最大可用堆記憶體為4096M,java heap最大值,使用的最大記憶體。預設是實體記憶體的1/4。等價于 -XX:MaxHeapSize

上面兩個值是配置設定JVM的最小和最大記憶體,取決于硬體實體記憶體的大小,建議均設為實體記憶體的一半。

-Xss :設定每個線程的堆棧大小為1024K。JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K.更具應用的線程所需記憶體大小進行 調整.在相同實體記憶體下,減小這個值能生成更多的線程.但是作業系統對一個程序内的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。等價于-XX:ThreadStackSize

-XX:PermSize=512m:設定非堆區初始記憶體配置設定大小為512m,其縮寫為 permanent size(持久化記憶體),設定記憶體的永久儲存區域。

-XX:MaxPermSize=512m:設定JVM最大允許配置設定的非堆記憶體最大上限為512m,設定最大記憶體的永久儲存區域。預設是實體記憶體的1/4

-Xss 15120 這使得JBoss每增加一個線程(thread)就會立即消耗15M記憶體,而最佳值應該是128K,預設值好像是512k.

-Xmn young generation的 heap 大小,一般設定為Xmx的3、4分之一。設定年輕代的大小整個JVM記憶體大小=年輕代大小 + 年老代大小 + 持久代大小持久代一般固定大小為64m,是以增大年輕代後,将會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。

-XX:MetaspaceSize:設定元空間大小。元空間的本質和永久代類似,都是對 JVM 規範中的方法區的實作。元空間與永久代之間最大差別:元空間并不在虛拟機中,而是使用本地記憶體。是以預設情況下,元空間的大小僅受本地記憶體限制,元空間預設比較小,我們可以調大一點。

+XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G實體記憶體,再吃盡一個G的swap。

-verbose:gc 列印垃圾收集資訊

-XX:+PrintGCDetails:輸出詳細GC收集日志資訊

-Xloggc:gc.log 指定垃圾收集日志檔案

-XX:SurvivorRatio:設定新生代中 eden 和 S0/S1 空間比例,預設 -XX:SurvivorRatio=8,Eden : S0 : S1 = 8 : 1 : 1

-XX:NewRatio:配置年輕代和老年代在堆結構的占比,預設 -XX:NewRatio=2 新生代占1,老年代占2,年輕代占整個堆的 1/3

-XX:MaxTenuringThreshold:設定垃圾最大年齡(對象回收時間)

-XX:+UseParNewGC 縮短minor收集的時間

-XX:+UseConcMarkSweepGC  縮短major收集的時間,提示:此選項在Heap Size 比較大而且Major收集時間較長的情況下使用更合适

新生代與老年代參數比例設定

-XX:+PrintGCDetails -verbose:gc -XX:SurvivorRatio=2 -XX:NewRatio=1

設定初始堆、最大記憶體空間并列印 gc 日志

-Xms20m -Xmx20m -XX:+PrintGCDetails -verbose:gc

堆記憶體配置設定

    JVM初始配置設定的記憶體由-Xms指定,預設是實體記憶體的1/64;JVM最大配置設定的記憶體由-Xmx指定,預設是實體記憶體的1/4。預設空餘堆記憶體小于40%時,JVM就會增大堆直到-Xmx的最大限制;空餘堆記憶體大于70%時,JVM會減少堆直到-Xms的最小限制。是以伺服器一般設定-Xms、-Xmx相等以避免在每次GC 後調整堆的大小。

非堆記憶體配置設定

    JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。

注意:

通過上面對JVM記憶體管理的介紹我們已經了解到JVM記憶體包含兩種:堆記憶體和非堆記憶體,另外JVM最大記憶體首先取決于實際的實體記憶體和作業系統。是以說設定VM參數導緻程式無法啟動主要有以下幾種原因: