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

posted @ 2017-09-19 13:37  bluebrow  阅读(269)  评论(0编辑  收藏  举报