jvm性能调优
jvm的堆栈=年轻代+年老代,持久代是非堆栈,默认持久代64M;1.6版本之前一般运行在 client模式下!性能较差,实际生产需要注意,下面来张图直观点!
CMS Old Gen:年老代 = 堆大小-年轻代 -Xms/-Xmx – -Xmn ;建议-Xmx ,-Xms设置成一样大
Par Eden Space + Par Survivor Space :年轻代 -Xmn 设置,影响实时处理性能
CMS Perm Gen: 持久代XX:PermSize,-XX:MaxPermSize设置,建议设置一样大
Code Cache:代码缓存去,编译和保存本地代码 -XX:InitialCodeCacheSize , -XX:ReservedCodeCacheSize 来设置,
如果代码缓存被占满,JVM会打印出一条警告消息,并切换到interpreted-only 模式:JIT编译器被停用,字节码将不再会被编译成机器码,因此运行效率会降低1个数量级
-XX:+UseCodeCacheFlushing:当代码缓存区满后,jvm放弃继续编译本地代码和方法,阻止热部署引起的内存泄漏!
jvm参数
参数 | 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 | 禁用图形化函数调用 |
调优设置
一. 环境变量中增加 JAVA_OPTS然后把自己设置好的参数放进去,例如:
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