线上JVM参数设置:
JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn700m -XX:PermSize=256m -Xss256k -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -XX:+UseParNewGC -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:-HeapDumpOnOutOfMemoryError "
JAVA_OPTS_EXT=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8 "
export JAVA_OPTIONS="$JAVA_MEM_OPTS $JAVA_OPTS_EXT "
下面列举的这些参数是需要重点掌握的:
参数名称 |
含义 |
默认值 |
说明 |
-Xms |
初始堆大小 |
物理内存的1/64 |
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 |
-Xmx |
最大堆大小 |
物理内存的1/4 |
默认空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制, 为了性能我们一般会把-Xms和-Xmx设置一样大,避免年青代初始内存占满后扩充空间时内存中数据迁移导致的性能影响 |
-Xmn |
年青代大小 |
物理内存的1/64 |
官方建议为最大堆大小的3/8,实际山可以大一点,可以设置为-Xmx的1/2 |
-Xss |
每个线程的堆栈大小 |
128K |
根据应用的线程所需内存大小进行调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000-5000左右,一般小的应用,如果栈不是很深,应该是128K够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。 |
-XX:NewSize |
年青代初始化大小 |
2M |
一般只用-Xmn设置即可 |
-XX:MaxNewSize |
年青代最大值 |
32M | |
-XX:PermSize |
持久代初始值 |
物理内存的1/64 |
堆大小为2G时一般256M |
-XX:MaxPermSize |
持久代最大值 |
物理内存的1/4 | |
-XX:NewRatio |
年青代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) |
2 |
-XX:NewRatio=4表示年青代与年老代所占比值为1:4,年青代占整个堆栈的1/5,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。 |
-XX:SurvivorRatio |
Eden区与Survivor区的大小比值 |
8 |
设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年青代的1/10 |
-XX:TargetSurvivorRatio |
设定survivor区的目标使用率 |
50% |
Survivor区的实际使用率是50%,调整Survivor的占用比率可以提高Survivor的利用率,最大为90% |
-XX:MaxTenuringThreshold |
设置垃圾最大存活阀值 |
15 |
如果设置为0的话,则年青代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年青代对象会在Survivor区进行多次复制,这样可以增加对象再年青代的存活时间,增加在年青代即被回收的概率,该参数只有在串行GC时才有效 |
-XX:+UseParallelGC |
选择垃圾收集器为并行收集器 |
|
选择垃圾收集器为并行收集器.此配置仅对年青代有效.即上述配置下,年青代使用并发收集,而年老代仍旧使用串行收集 |
-XX:ParallelGCThreads |
并行收集器的线程数 |
|
此值最好配置与处理器数目相等,同样适用于CMS收集器(运行在老年代) |
-XX:+UseParNewGC |
设置年青代为并行收集 |
|
可与CMS收集同时使用,JDK5.0以上JVM会根据系统配置自行设置,所以无需再设置此值 |
-XX:+UseParallelOldGC |
设置年老代为并行收集 |
|
JDK6.0支持对年老代并行收集 |
-XX:MaxGCPauseMillis |
|
|
设置每次年青代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年青代大小,以满足此值,一般设置为100 |
-XX:+UseConcMarkSweepGC |
设置年老代为并发收集 |
默认不启用 |
测试中配置这个以后,-XX:NewRatio=4的配置失效了,所以此时年青代大小最好用-Xmn设置 |
-XX:+CMSClassUnloadingEnabled |
|
|
设置年老代CMS收集器对持久代进行垃圾回收(CMS收集器默认不会对持久代进行垃圾回收,如果希望对持久代进行垃圾回收,需要设置此参数) |
-XX:CMSInitiatingPermOccupancyFraction |
设置Perm Gen使用到达多少比率时触发CMS收集 |
jdk5默认68%,jdk6默认92% |
|
-XX:CMSInitiatingOccupancyFraction |
设置old区使用到达多少比率时触发CMS收集 |
Jdk5默认68%,jdk6默认92% |
|
-XX:-HeapDumpOnOutOfMemoryError |
JVM会在遇到OutOfMemoryError时拍摄一个“堆转储快照”,并将其保存在一个文件中 |
|