JDK
[root@wallet01 ~]# yum remove -y java-1.7.0-openjdk
[root@wallet01 ~]# yum remove -y java-1.6.0-openjdk

[root@wallet01 ~]# tar zxvf jdk-7u80-linux-x64.tar.gz -C /usr/local/

[root@wallet01 ~]# vim /etc/profile
JAVA_HOME=/usr/local/jdk1.7.0_80
JAVA_BIN=/usr/local/jdk1.7.0_80/bin
PATH=$PATH:$JAVA_BIN
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

[root@wallet01 ~]# source /etc/profile

[root@wallet01 ~]# java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

Tomcat
[root@wallet01 ~]# tar -zxvf apache-tomcat-7.0.75.tar.gz -C /usr/local/
[root@wallet01 ~]# cd /usr/local/apache-tomcat-7.0.75/bin
[root@wallet01 bin]# ./version.sh 
Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.75
Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.75
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.75/temp
Using JRE_HOME:        /usr/local/jdk1.7.0_80
Using CLASSPATH:       /usr/local/apache-tomcat-7.0.75/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.75/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.75
Server built:   Jan 18 2017 20:54:42 UTC
Server number:  7.0.75.0
OS Name:        Linux
OS Version:     3.10.0-862.el7.x86_64
Architecture:   amd64
JVM Version:    1.7.0_80-b15
JVM Vendor:     Oracle Corporation

[root@wallet01 bin]# ./startup.sh 
Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.75
Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.75
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.75/temp
Using JRE_HOME:        /usr/local/jdk1.7.0_80
Using CLASSPATH:       /usr/local/apache-tomcat-7.0.75/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.75/bin/tomcat-juli.jar
Tomcat started.

[root@wallet01 bin]# tail -n 50 ../logs/catalina.out 
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=/usr/local/apache-tomcat-7.0.75/endorsed
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=/usr/local/apache-tomcat-7.0.75
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=/usr/local/apache-tomcat-7.0.75
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.io.tmpdir=/usr/local/apache-tomcat-7.0.75/temp
Dec 03, 2020 1:55:32 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Dec 03, 2020 1:55:32 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Dec 03, 2020 1:55:32 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1149 ms
Dec 03, 2020 1:55:32 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Dec 03, 2020 1:55:32 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.75
Dec 03, 2020 1:55:32 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/apache-tomcat-7.0.75/webapps/ROOT
Dec 03, 2020 1:55:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /usr/local/apache-tomcat-7.0.75/webapps/ROOT has finished in 658 ms
Dec 03, 2020 1:55:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/apache-tomcat-7.0.75/webapps/docs
Dec 03, 2020 1:55:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /usr/local/apache-tomcat-7.0.75/webapps/docs has finished in 73 ms
Dec 03, 2020 1:55:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/apache-tomcat-7.0.75/webapps/examples
Dec 03, 2020 1:55:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /usr/local/apache-tomcat-7.0.75/webapps/examples has finished in 503 ms
Dec 03, 2020 1:55:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/apache-tomcat-7.0.75/webapps/host-manager
Dec 03, 2020 1:55:34 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /usr/local/apache-tomcat-7.0.75/webapps/host-manager has finished in 109 ms
Dec 03, 2020 1:55:34 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /usr/local/apache-tomcat-7.0.75/webapps/manager
Dec 03, 2020 1:55:34 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /usr/local/apache-tomcat-7.0.75/webapps/manager has finished in 108 ms
Dec 03, 2020 1:55:34 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Dec 03, 2020 1:55:34 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Dec 03, 2020 1:55:34 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1578 ms


JVM参数调优

堆
-Xms2048m  --初始堆内存大小
-Xmx2048m  --最大堆内存大小
-XX:+HeapDumpOnOutOfMemoryError --在发生内存溢出时自动生成堆内存快照
-XX:HeapDumpPath=/tmp/heapdump.hprof  --改变默认的堆内存快照保存路径

新生代
-Xmn512m  --新生代内存大小
-XX:NewRatio  --新生代与老年代的比值,例如 -XX:NewRatio=3 指定老年代/新生代为3/1. 老年代占堆大小的 3/4 ,新生代占 1/4 
-XX:SurvivorRatio --新生代中Eden区与Survivor区的比值,默认为8,代表Eden:Subrvivor = 8:1
-XX:MaxTenuringThreshold  --晋升到老年代的对象年龄,每次Minor GC之后,年龄就加1,当超过这个参数的值时进入老年代
-XX:PretenureSizeThreshold --直接晋升到老年代对象的大小,设置这个参数后,大于这个参数的对象将直接在老年代分配

持久代
-XX:PermSize=512m  --持久代内存初始大小
-XX:MaxPermSize=512m --持久代内存最大值

CMS收集器(关注响应时间)
-XX:+UseConcMarkSweepGC --使用ParNew + CMS +  Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
-XX:+CMSParallelRemarkEnabled  --为了减少第二次暂停的时间,并行执行CMS重标记阶段
-XX:+UseCMSCompactAtFullCollection --由于CMS收集器会产生碎片,此参数设置在GC后是否需要一次内存碎片整理过程,仅在CMS收集器时有效
-XX:CMSFullGCsBeforeCompaction --设置CMS收集器在进行若干次GC后再进行一次内存碎片整理过程,通常与UseCMSCompactAtFullCollection参数一起使用
-XX:CMSInitiatingOccupancyFraction=70  设置CMS收集器在老年代空间被使用多少触发GC,默认值为68%,仅在CMS收集器时有效 
计算公式:CMSInitiatingOccupancyFraction <=((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)*100
-XX:+CMSClassUnloadingEnabled --CMS收集器对持久代进行GC
-XX:+ExplicitGCInvokesConcurrent  --无论什么时候调用系统GC,都执行CMS GC,而不是Full GC
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses  --当有系统GC调用时,持久代也被包括进CMS GC的范围内

串行与并行收集器(关注吞吐量)
-XX:+UseSerialGC  --使用Serial + Serial Old的收集器组合进行GC,jvm运行在Client模式下的默认值
-XX:+UseParNewGC --使用ParNew + Serial Old的收集器组合进行GC
-XX:+UseParallelGC --使用Parallel Scavenge +  Serial Old的收集器组合进行GC,jvm运行在Server模式下的默认值
-XX:+UseParallelOldGC --使用Parallel Scavenge +  Parallel Old的收集器组合进行GC
-XX:ParallelGCThreads --设置并行GC进行内存回收的线程数,当JVM独占地使用系统和处理器时使用默认设置更有意义。 但是,如果有多个JVM在同一台主机上运行,我们应该使用-XX:ParallelGCThreads来减少GC线程数到一个适当的值。 例如,如果4个以服务器方式运行的JVM同时跑在在一个具有16核处理器的主机上,设置-XX:ParallelGCThreads=4是明智的,它能使不同JVM的垃圾收集器不会相互干扰。
-XX:GCTimeRatio --GC时间占总时间的比列,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge 收集器时有效
-XX:MaxGCPauseMillis --设置GC的最大停顿时间,在Parallel Scavenge 收集器下有效
-XX:UseAdaptiveSizePolicy --动态调整java堆中各个区域的大小以及进入老年代的年龄
-XX:+DisableExplicitGC  --完全忽略系统GC调用(不管使用的收集器是什么类型)

参数示例
export JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Xmn512m -XX:PermSize
=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBefore
Compaction=0 -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSClassUnloadingEnabled -XX:+ExplicitGCInvokesConcurrent -XX:+ExplicitGCInvokes
ConcurrentAndUnloadsClasses -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai"


TOMCAT参数调优

线程池
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>
name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。

namePrefix:为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。

maxThreads :Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程数,默认值是200。

minSpareThreads:最小备用线程数,Tomcat启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是10。

maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。

当请求并发高于500(最大备用线程数)的时候,线程池会继续创建线程,来满足特大突发性并发。当并发请求数降下之后,线程池中有空闲线程,那么,无论线程空闲时间是否达到60s,线程池都会进行回收至500。500以内的线程会根据空闲时间是否大于60s来判断是否需要进行回收。
maxThreads是指Tomcat线程池创建的最大线程数,而maxConnections则是Tomcat一瞬间最多能够处理的并发连接数。比如maxThreads=1000,maxConnections=800,假设某一瞬间的并发请求是1000,那么最终Tomcat的线程数将会是800,即同时处理800个请求,剩余200进入队列“排队”,如果acceptCount=100,那么有100个请求会被拒掉。
注意:根据前面所说,只是并发那一瞬间Tomcat会起800个线程处理请求,但是稳定后,某一瞬间可能只有很少的线程处于运行状态,大部分线程是TIMED_WAITING,如果你的应用处理时间够快的话。所以真正决定Tomcat最大可能达到的线程数是maxConnections这个参数和并发数,当并发数超过这个参数则请求会排队,这时响应的快慢就看你的程序性能了。

连接器
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               URIEncoding="UTF-8"
               connectionTimeout="30000"
               enableLookups="false"
               disableUploadTimeout="false"
               connectionUploadTimeout="150000"
               acceptCount="300"
               keepAliveTimeout="120000"
               maxKeepAliveRequests="1"
               compression="on"
               compressionMinSize="2048"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" 
               redirectPort="8443" />
URIEncoding:Tomcat使用utf8对URI中出现的中文进行解码。

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。

connnectionTimeout:Tomcat与客户端建立socket连接后,直到Tomcat接收到客户端第一个请求,Tomcat的等待时间,若超时,Tomcat关闭连接。

enableLookups:是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为false。

disableUploadTimeout:上传时是否使用超时机制。

connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。

keepAliveTimeout:长连接最大保持时间(毫秒),在同一socket连接,第一个请求与第二个请求的最大间隔时间,若超时,Tomcat关闭连接,默认是使用 connectionTimeout 时间,-1 为不限制超时。

maxKeepAliveRequests:表示在Tomcat关闭连接之前,该连接最大支持的请求数。超过该请求数的连接将被关闭,1表示禁用,-1表示不限制个数,默认100个。

compression:是否对响应数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。

compressionMinSize:表示压缩响应数据的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048。

compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩。

noCompressionUserAgents="gozilla, traviata": 对于以下的浏览器,不启用压缩。

如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 Tomcat 处理了,那么也就不需要配置在 Tomcat 中配置压缩了。