Java JVM 虚拟机调优样本 tomcat setenv.sh for jvm8

硬件,主机内存12g
#add tomcat pid
#CATALINA_PID="/var/run/tomcat.pid"
#CATALINA_OPTS
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=12345
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false
  -Djava.rmi.server.hostname=192.168.2.8"
#add JAVA_HOME
#JAVA_HOME=/usr/java/default
#add JAVA_OPTS
JAVA_OPTS="-server -Xms8g -Xmx8g -Xmn2g -XX:MaxNewSize=2g"
JAVA_OPTS="$JAVA_OPTS -XX:CICompilerCount=8 -XX:+UseCompressedOops"
JAVA_OPTS="$JAVA_OPTS -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90"
JAVA_OPTS="$JAVA_OPTS -XX:ReservedCodeCacheSize=1024m -XX:-UseAdaptiveSizePolicy"
JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/Shanghai -XX:-DontCompileHugeMethods"
JAVA_OPTS="$JAVA_OPTS -Xss256k -XX:+AggressiveOpts -XX:+UseBiasedLocking"
JAVA_OPTS="$JAVA_OPTS -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled "
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=512m -XX:+UseFastAccessorMethods"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"
JAVA_OPTS="$JAVA_OPTS -XX:+UseGCOverheadLimit -XX:AllocatePrefetchDistance=256 -XX:AllocatePrefetchStyle=1"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxGCPauseMillis=200"
说明:
-Xmx8g:设置JVM最大可用内存为8G。
-Xms8g:设置JVM促使内存为8G。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio=2: #生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,可以尝试定制生还者池设置
-XX:NewSize:    #新生成的池的初始大小,默认为2M
-XX:MaxNewSize=2g :设置年轻代初始化大小为2G也可以设置成2048m。小于-Xmn即可。#新生成的池的最大值,默认为32M
-Xss256k: 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:ReservedCodeCacheSize=1024m:设置CodeCache大小,也可以设置成1g,选项含义如下:
==========================
-XX:InitialCodeCacheSize and -XX:ReservedCodeCacheSize
JVM一个有趣的,但往往被忽视的内存区域是“代码缓存”,它是用来存储已编译方法生成的本地代码。代码缓存确实很少引起性能问题,但是一旦发生其影响可能是毁灭性的。如果代码缓存被占满,JVM会打印出一条警告消息,并切换到interpreted-only 模式:JIT编译器被停用,字节码将不再会被编译成机器码。因此,应用程序将继续运行,但运行速度会降低一个数量级,直到有人注意到这个问题。就像其他内存区域一样,我们可以自定义代码缓存的大小。相关的参数是-XX:InitialCodeCacheSize 和-XX:ReservedCodeCacheSize,它们的参数和上面介绍的参数一样,都是字节值。
 
-XX:+UseCodeCacheFlushing
如果代码缓存不断增长,例如,因为热部署引起的内存泄漏,那么提高代码的缓存大小只会延缓其发生溢出。为了避免这种情况的发生,我们可以尝试一个有趣的新参数:当代码缓存被填满时让JVM放弃一些编译代码。通过使用-XX:+UseCodeCacheFlushing 这个参数,我们至少可以避免当代码缓存被填满的时候JVM切换到interpreted-only 模式。不过,我仍建议尽快解决代码缓存问题发生的根本原因,如找出内存泄漏并修复它。
========================
其它选项说明
Alan@wu
Tomcat 内存与优化篇
Tomcat 内存与优化
一、Tomcat 运行环境介绍
1.Tomcat 本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和Java虚拟机;
2.Java 程序启动时JVM都会分配一个初始内存和最大内存给这个应用;
3.当应用程序用到最大内存的时刻,就会触发JVM做垃圾回收(GC)动作,释放被占用的内存;
4.因此想要调整Java程序启动时的初始内存和最大内存,需要向JVM申请;
5.如果初始内存大小设置过小,且此时初始化的应用对象过多,虚拟机就必须重复的加载内存来满足使用;
6.基于以上原因,最好把初始内存大小(Xms)和最大内存(Xmx)设置成一样;
7.JVM上所有的对象都在"""堆区(heap)"""上分配内存(也有在"栈"上分配内存的)
8.堆区的大小是可以动态扩展的,但"""堆"""的大小受限于系统使用的物理内存,当应用程序需要的内存超出"堆"的最大值时,JVM虚拟机就会抛出内存溢出异常,并且导致应用程序奔溃;
9.基于以上原因,建议“堆”的大小设置成物理内存的80%
二、Tomcat 内存设置(for Linux)
1./bin/catalina.sh #路径以及修改内存的文件
2.JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m" #内存参数以及值
3.-Xms:初始内存大小
4.-Xmx:最大内存
5.-Xss:每个线程所消耗的内存大小(如-Xss15120是指每增加一个线程就会消耗15M内存),最好设置成128K,默认值为512K
6.-XX:PermSize:设定内存的永久保存区初始大小,默认为64M(永久是指方法区、永久代,还有年轻代、老年代)——jvm8无效   用-XX:MetaspaceSize=256m 代替
7.-XX:MaxPermSize:设定内存永久保存区最大大小,默认为64M——jvm8无效  用  -XX:MaxMetaspaceSize=512m代替
8.其他参数:
a)  -XX:SurvivorRatio=2: #生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,可以尝试定制生还者池设置
b)  -XX:NewSize:    #新生成的池的初始大小,默认为2M
c)  -XX:MaxNewSize: #新生成的池的最大大小,默认为32M
d)  +XX:AggressiveHeap #该参数会使得Xms没有意义,这个参数让参数JVM忽略Xmx参数,疯狂的吃掉一个G的物理内存,再疯狂的吃掉一个G的swap
e)  -verbose:gc #实现垃圾收集信息
f)  -Xloggc:gc.log  #指定来及收集日志文件
g)  -Xmn:   #年轻代的堆区大小,一般设置成Xmx的3、4分之一
h)  -XX:+UseParNewGC    #缩短minor收集时间(minor GC是指在年轻代触发的GC垃圾回收动作)
I)  -XX:+UseConcMarkSweepGC #缩短major收集的时间(major收集是指在年老代触发Full GC垃圾回收动作),此选项在heap size(堆区大小)比较大而且major收集时间较长的情况下使用更合适
j)  -XX:userParNewGC #可用来并行收集(多CPU)
k)  -XX:ParallerGCThreads #可用来增加并行度(多CPU)
l)  -XX:UseParallerGC #设置后可以使用并行清理收集器(多CPU)
m)  如果JVM的堆大小大于 1G,则应该使用以下配置:
-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16
或者将堆的总大小的50%到60%分配给新生成的池,调大新对象区,减少Full GC次数。
9.注意:
a)  虚拟机的"堆区大小"决定了虚拟机花费在收集垃圾上的时间和频率;
b)  如果"堆的大小"很大,那么执行Full GC垃圾回收就会很慢,但是频率降低了;
c)  如果把"堆的大小"调小,执行Full GC垃圾收回就会很快,但是会更加频繁;
d)  因此建议把"堆区大小"设置物理内存的80%左右
e)  建议把内存的最高值和最低值的差值缩小。不然会浪费很多内存;
f)  最低值加大,那么最高值可以随便设置;
g)  但是要根据实际的物理内存来设置,且大于物理内存,tomcat就无法启动,可能会导致内存被系统收回,终止进程

发表评论

电子邮件地址不会被公开。 必填项已用*标注