本文將教大家如何進行JVM參數配置
JVM提供了大量命令行參數
大家可以將本文打印下來作為資料備查
最後還將為大家講解如何進行調優
相信你一定會感興趣的
高手教大家如何進行JVM參數配置
堆大小設置
JVM中最大堆大小有三方面限制
相關操作系統的數據模型(
bt還是
bit)限制
系統的可用虛擬內存限制
系統的可用物理內存限制
位系統下
一般限制在
G~
G;
為操作系統對內存無限制
我在WindowsServer
系統
G物理內存
JDK
下測試
最大可設置為
m
典型JVM參數配置
java
Xmx
m
Xms
m
Xmn
g
Xss
k
Xmx
m:設置JVM最大可用內存為
M
Xms
m:設置JVM促使內存為
m
此值可以設置與
Xmx相同
以避免每次垃圾回收完成後JVM重新分配內存
Xmn
g:設置年輕代大小為
G
整個堆大小=年輕代大小+年老代大小+持久代大小
持久代一般固定大小為
m
所以增大年輕代後
將會減小年老代大小
此值對系統性能影響較大
Sun官方推薦配置為整個堆的
/
Xss
k:設置每個線程的堆棧大小
JDK
以後每個線程堆棧大小為
M
以前每個線程堆棧大小為
K
更具應用的線程所需內存大小進行調整
在相同物理內存下
減小這個值能生成更多的線程
但是操作系統對一個進程內的線程數還是有限制的
不能無限生成
經驗值在
~
左右
java
Xmx
m
Xms
m
Xss
k
XX:NewRatio=
XX:SurvivorRatio=
XX:MaxPermSize=
m
XX:MaxTenuringThreshold=
XX:NewRatio=
:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)
設置為
則年輕代與年老代所占比值為
:
年輕代占整個堆棧的
/
XX:SurvivorRatio=
:設置年輕代中Eden區與Survivor區的大小比值
設置為
則兩個Survivor區與一個Eden區的比值為
:
一個Survivor區占整個年輕代的
/
XX:MaxPermSize=
m:設置持久代大小為
m
XX:MaxTenuringThreshold=
:設置垃圾最大年齡
如果設置為
的話
則年輕代對象不經過Survivor區
直接進入年老代
對於年老代比較多的應用
可以提高效率
如果將此值設置為一個較大值
則年輕代對象會在Survivor區進行多次復制
這樣可以增加對象再年輕代的存活時間
增加在年輕代即被回收的概論
回收器選擇
JVM給了三種選擇
串行收集器
並行收集器
並發收集器
但是串行收集器只適用於小數據量的情況
所以這裡的選擇主要針對並行收集器和並發收集器
默認情況下
JDK
以前都是使用串行收集器
如果想使用其他收集器需要在啟動時加入相應參數
JDK
以後
JVM會根據當前系統配置進行判斷
吞吐量優先的並行收集器
如上文所述
並行收集器主要以到達一定的吞吐量為目標
適用於科學技術和後台處理等
典型JVM參數配置
java
Xmx
m
Xms
m
Xmn
g
Xss
k
XX:+UseParallelGC
XX:ParallelGCThreads=
XX:+UseParallelGC:選擇垃圾收集器為並行收集器
此配置僅對年輕代有效
即上述配置下
年輕代使用並發收集
而年老代仍舊使用串行收集
XX:ParallelGCThreads=
:配置並行收集器的線程數
即
同時多少個線程一起進行垃圾回收
此值最好配置與處理器數目相等
java
Xmx
m
Xms
m
Xmn
g
Xss
k
XX:+UseParallelGC
XX:ParallelGCThreads=
XX:+UseParallelOldGC
XX:+UseParallelOldGC:配置年老代垃圾收集方式為並行收集
JDK
支持對年老代並行收集
java
Xmx
m
Xms
m
Xmn
g
Xss
k
XX:+UseParallelGC
XX:MaxGCPauseMillis=
XX:MaxGCPauseMillis=
:設置每次年輕代垃圾回收的最長時間
如果無法滿足此時間
JVM會自動調整年輕代大小
以滿足此值
java
Xmx
m
Xms
m
Xmn
g
Xss
k
XX:+UseParallelGC
XX:MaxGCPauseMillis=
XX:+UseAdaptiveSizePolicy
XX:+UseAdaptiveSizePolicy:設置此選項後
並行收集器會自動選擇年輕代區大小和相應的Survivor區比例
以達到目標系統規定的最低相應時間或者收集頻率等
此值建議使用並行收集器時
一直打開
響應時間優先的並發收集器
如上文所述
並發收集器主要是保證系統的響應時間
減少垃圾收集時的停頓時間
適用於應用服務器
電信領域等
典型JVM參數配置
java
Xmx
m
Xms
m
Xmn
g
Xss
k
XX:ParallelGCThreads=
XX:+UseConcMarkSweepGC
XX:+UseParNewGC
XX:+UseConcMarkSweepGC:設置年老代為並發收集
測試中配置這個以後
XX:NewRatio=
的配置失效了
原因不明
所以
此時年輕代大小最好用
Xmn設置
XX:+UseParNewGC:設置年輕代為並行收集
可與CMS收集同時使用
JDK
以上
JVM會根據系統配置自行設置
所以無需再設置此值
java
Xmx
m
Xms
m
Xmn
g
Xss
k
XX:+UseConcMarkSweepGC
XX:CMSFullGCsBeforeCompaction=
XX:+UseCMSCompactAtFullCollection
XX:CMSFullGCsBeforeCompaction:由於並發收集器不對內存空間進行壓縮
整理
所以運行一段時間以後會產生
碎片
使得運行效率降低
此值設置運行多少次GC以後對內存空間進行壓縮
整理
XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮
可能會影響性能
但是可以消除碎片
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27039.html