JVM設置內存的參數還是不少的,比如堆內存,堆外內存,線程棧,永久代,二進制碼緩存,所以在對實際應用進行調優的時候,這些參數都需要注意。如果不是太缺資源,還請在內存的使用上放寬一些,尤其是關鍵業務。
![JVM參數配置 內存大小設置](http://p2.ttnews.xyz/loading.gif)
先來點大家熟悉的
-Xmx2048m, -Xms2048m
堆內存大小,一般來情況下都會設置相同數字,一面JVM自己調來調去。再來大小控制在2G左右,最好不要炒作4G,超過4G意味著更長的GC事件,更加意味著你的應用太臃腫,是應該拆分的時候了。
-Xmn | -XX:NewSize 和-XX:MaxNewSize | -XX:NewRatio
堆內存新生代大小,JDK默認新生代佔堆大小的1/3, 增大新生代能減少GC的頻率,但是會加大GC的停頓時間。-Xmn等價於-XX:NewSize and -XX:MaxNewSize賦值同值。-XX:NewRatio用來設置新生代佔用比例。
-XX: PermSize=128m -XX:MaxPermSize=512m (JDK7)
堆內存永久代大小,現在是個應用初始化值都會從128m開始
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m (JDK8)
JDK8後永生代廢棄,被元空間代替。元空間允許無限使用本地內存,所以設置一個最大值很有必要。
![JVM參數配置 內存大小設置](http://p2.ttnews.xyz/loading.gif)
再來點不常用的
-XX:SurvivorRatio
新生代中每個存活區的大小,默認為8,要避免設置太小使得存活區放不下的臨時對象直接晉升到舊生代。
-Xss
在堆之外,線程佔用棧內存,默認每條線程為1M(以前是256K)。想多開點線程就設置小一點,但是線程操作一些大對象,或者遞歸操作就不要設置太小
-XX:MaxDirectMemorySize
堆外內存/直接內存的大小,默認為Heap區總內存減去一個Survivor區的大小
-XX:ReservedCodeCacheSize
JIT編譯後二進制代碼的存放區,滿了之後就不再編譯。JDK7默認不開多層編譯48M,開了96M,而JDK8默認開多層編譯240M。
閱讀更多 塵埃中的清風 的文章