- tomcat安装:
-
- 从官网下载tomcat压缩包,然后在指定的目录中进行解压;
- 安装jdk,并添加jdk环境变量;
- Tomcat目录:
[[email protected] ~]$ ll -h tob-api
总用量 120K
appdir ------ war包部署位置
bin -------启动程序,启动相关的内存设置等;
conf -------端口、解压包路径和解压目录名定义等
lib
LICENSE
logs -------日志
NOTICE
RELEASE-NOTES
RUNNING.txt
temp -------启动时候放置一些临时文档(可删除)
webapps --------war包解压后的目录
work ----------启动后一些参数、环境变量(可删除)
- Tomcat配置;
配置主要有两个文件:
- tomcat/conf/server.xml 文件;
此文件中定义了tomcat的端口信息;并且可以指定war包路径,以及解压war包后在webapps目录下的目录名称;
[[email protected] tob-api]$ grep -3 war conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".log"
pattern="%t ^=^ %{X-FORWARDED-FOR}i ^=^ %a ^=^ %u ^=^ %{User-Agent}i ^=^ %p ^=^ %s ^=^ %b ^=^ %S ^=^ %T ^=^ %D ^=^ %h ^=^ %r ^=^ %U" />
<Context path="/" docBase="${catalina.base}/appdir/xxx.war" debug="0" privileged="true" reloadable="true" />
</Host>
</Engine>
</Service>
[[email protected] tob-api]$
其中:path为"/"说明解压后是ROOT目录;docBase指定了war包存放路径和名称; - tomcat/bin/catalina.sh 文件;
文件定义了内存的使用,以及tomcat性能调优;
#!/bin/sh
xms_size=‘2G‘
xmx_size=‘2G‘
tomcat调优:
ENV_DM=`cat ~/.diamond.domain|grep -v "#"`
if [ "${ENV_DM}x" == "x" ] || [ "${ENV_DM}x" == "diamond.live.ds.gome.com.cnx" ] || [ "${ENV_DM}x" == "diamond.prelive.ds.gome.com.cnx" ]
then
JAVA_OPTS="$JAVA_OPTS -Dapp.home=${CATALINA_BASE} -server -Xms${xms_size} -Xmx${xmx_size} -Xmn2g -Xss256k -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:AutoBoxCacheMax=20000 -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=${CATALINA_BASE}/logs/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${CATALINA_BASE}/logs/ -Xloggc:${CATALINA_BASE}/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
else
JAVA_OPTS="$JAVA_OPTS -Dapp.home=${CATALINA_BASE} -server -Xms${xms_size} -Xmx${xmx_size} -Xmn128m -Xss256k -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:AutoBoxCacheMax=20000 -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=${CATALINA_BASE}/logs/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${CATALINA_BASE}/logs/ -Xloggc:${CATALINA_BASE}/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
fi
jvm堆配置参数
1. -Xms初始堆大小
默认物理内存的1/64(<1GB)
2. -Xmx最大堆大小
默认物理内存的1/4(<1GB),实际中建议不大于4GB
3. 一般建议设置-Xms=-Xmx
好处是避免每次在gc后,调整堆的大小,减少系统内存分配开销
4. 整个堆大小=年轻代大小+年老代大小+持久化大小
jvm新生代(young generation)
1. 新生代=1个eden区+2个Survior区
2. -Xmn 年轻代大小(1.4or lator)
-XX:NewSize,-XX:MaxNewSize(设置年轻代大小(for 1.3/1.4))
默认值大小为整个堆的3/8
3. -XX:NewRatio
年轻代(包含Eden和两个Survivor区)与老年代的比值(除去持久化)
Xms=Xmx并且设置了Xmn的情况下,该参数不需要设置
4. -XX:SurviorRatio
Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
5. 用来存放JVM刚分配的Java对象
jvm老年代(tenured greneration)
1. 老年代=整个堆-年轻代大小-持久化大小
2. 年轻代中经过垃圾回收没有回收掉的对象被复制到年老代
3. 老年代存储对象比年轻代年龄大的多,而且不发达对象(缓存)
4. 新建的对象也有可能直接进入老年代
4.1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不再新生代分配,而是直接在老年代分配
4.2、大的数组对象,切数组中无引用外部对象
5. 老年代大小无配置参数
java持久代(perm generation)
1. 持久代=整个堆-年轻代大小-老年代大小
2. -XX:PermSize -XX:MaxPermSize
设置持久代的大小,一般情况推荐把-XX:PermSize设置成XX:MaxPermSize的值为相同的值,因为永久代的调整也会导致堆内存需要触发fgc(Full GC)
3. 存放Class,Method元信息,其大小与项目的规模、类、方法的数量有关。一般设置为128M就够用,设置原则是预留30%的空间
4. 永久代的回收方式
4.1、常量池的常量,无用的类信息,常量的回收很简单,没有引用的就可以被回收
4.2、对无用的类进行回收,必须保证3点:
类的所有实例都已经被回收
加载类的ClassLoader已经被回收
类对象的Class对象没有被引用(既没有通过反射引用该类的方法)