jvm的堆栈=年轻代+年老代,持久代是非堆栈,默认持久代64M;1.6版本以前通常运行在 client模式下!性能较差,实际生产须要注意,下面来张图直观点!html
CMS Old Gen:年老代 = 堆大小-年轻代 -Xms/-Xmx - -Xmn ;建议-Xmx ,-Xms设置成同样大java
Par Eden Space + Par Survivor Space :年轻代 -Xmn 设置,影响实时处理性能linux
CMS Perm Gen: 持久代XX:PermSize,-XX:MaxPermSize设置,建议设置同样大windows
Code Cache:代码缓存去,编译和保存本地代码 -XX:InitialCodeCacheSize , -XX:ReservedCodeCacheSize 来设置,缓存
若是代码缓存被占满,JVM会打印出一条警告消息,并切换到interpreted-only 模式:JIT编译器被停用,字节码将再也不会被编译成机器码,所以运行效率会下降1个数量级tomcat
-XX:+UseCodeCacheFlushing:当代码缓存区满后,jvm放弃继续编译本地代码和方法,阻止热部署引发的内存泄漏!多线程
jvm参数app
参数 | jdk1.6 | jdk1.7 | jdk1.8 | 说明 |
-server | - | - | jre\server\jvm.dll server VM模式,不然默认-client1.6,以后默认server VM | |
-Xms -Xmx | 堆栈大小,起始堆栈,最大可用堆栈 | |||
-Xmn | 堆栈年轻代大小,Sun官方推荐为整个堆栈的3/8 | |||
-Xss | 每一个线程的大小,通常一个请求就是一个线程,这个值不宜多大,建议不超过1M | |||
-XX:+AggressiveOpts | 新技术优化 启用,升级版本时,若是有的话 | |||
-XX:+UseBiasedLocking | 启用一个优化了的线程锁 | |||
-XX:PermSize=128M-XX:MaxPermSize=256M | - | JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64 | ||
-XX:+DisableExplicitGC | 显示的调用”System.gc()”控制 | |||
-XX:+UseParNewGC | 对年轻代采用多线程并行回收 | |||
-XX:MaxTenuringThreshold | 0~15 | 设置垃圾最大年龄(次数) | ||
-XX:+CMSParallelRemarkEnabled | 在使用UseParNewGC 的状况下, 尽可能减小 mark 的时间 | |||
-XX:+UseCMSCompactAtFullCollection | 在使用concurrent gc 的状况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减小 | |||
-XX:LargePageSizeInBytes | 指定 Java heap的分页页面大小 | |||
-XX:+UseFastAccessorMethods | get,set 方法转成本地代码 | |||
-XX:+UseCMSInitiatingOccupancyOnly | 指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 启动收集 | |||
-XX:CMSInitiatingOccupancyFraction=70 |
默认1.5:68,1.6/1.7:92;年老代开始回收阀值,需知足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn(1-1/(sradio+2)) 近似Xmn ,其实差蛮多的
即:Xmn *(200-CMSInitiatingOccupancyFraction)/(100-CMSInitiatingOccupancyFraction)<= Xmn
|
|||
-Djava.awt.headless=true | 禁用图形化函数调用 |
调优设置less
一. 环境变量中增长 JAVA_OPTS而后把本身设置好的参数放进去,例如:jvm
32bit OS:
JAVA_OPTS=
-server
-Djava.awt.headless=true
-Xms1536M
-Xmx1536M
-Xmn256M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:PermSize=128M
-XX:MaxPermSize=256M
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=80
64bit OS:
JAVA_OPTS=
-server
-Djava.awt.headless=true
-Xms6g
-Xmx6g
-Xmn544M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=90
二. 在app启动/初始化时加上启动参数,如tomcat启动时:
catalina.bat windows的:
set JAVA_OPTS=-server -Xms1536M ... ... 本身组合的参数
catalina.sh linux/unix的:
export JAVA_OPTS="-server -Xms1536M ... ...本身组合的参数"
windows server 安装版本:
$(tomcate_base_dir)/bin/Tomcat7w.exe ,启动后填写参数
填写在:java-->JavaOpions 中,若是有填写 -Xms,-Xmx,-Xss最后的3个不要填写,不然会被覆盖,注意参数最后不能有空格,不然会失败(tomcat启动不了)
备注:
1. 在jre/bin/server/下Xusage.txt有参数说明及用法;
2. 32bit,64bit OS jvm能够设置使用的堆栈也是不同的,通常32bit os理论可用的最大为2048M,二实际其自身还占使用一些,
像缓存空间,非堆栈等 通常默认不超过256M,加上自身调节的空间要达到 300+M才行,因此堆栈最大不会超过1700M,具体大小自行验证,
64bit OS通常设置多少,均可以使用的!
参考:
http://www.cnblogs.com/jack204/archive/2012/07/02/2572934.html
http://blog.csdn.net/lifetragedy/article/details/7708724
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html