目录
5.1.4查看OOM(Out Of Memory)——JDK工具监控使用情况
在目前流行的互联网架构中,Tomcat在目前的网络编程中是举足轻重的,由于Tomcat的运行依赖于JVM,从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优三部分
一、JVM组成
1.JVM的组成及详解
JVM组成部分
- 类加载子系统: 使用Java语言编写.java Source Code文件,通过javac编译成.class Byte Code文件。class loader类加载器将所需所有类加载到内存,必要时将类实例化成实例
- 运行时数据区: 最消耗内存的空间,需要优化
- 执行引擎: 包括JIT (JustInTimeCompiler)即时编译器, GC垃圾回收器
- 本地方法接口: 将本地方法栈通过JNI(Java Native Interface)调用Native Method Libraries, 比如:C,C++库等,扩展Java功能,融合不同的编程语言为Java所用
JVM运行时数据区域由下面部分构成
- Method Area (线程共享):方法区是所有线程共享的内存空间,存放已加载的类信息(构造方法,接口定义),常量(final),静态变量(static), 运行时常量池等。但实例变量存放在堆内存中. 从JDK8开始此空间由永久代改名为元空间
- heap (线程共享):堆在虚拟机启动时创建,存放创建的所有对象信息。如果对象无法申请到可用内存将抛出OOM异常.堆是靠GC垃圾回收器管理的,通过-Xmx -Xms 指定最大堆和最小堆空间大小
- Java stack (线程私有):Java栈是每个线程会分配一个栈,存放java中8大基本数据类型,对象引用,实例的本地变量,方法参数和返回值等,基于FILO()(First In Last Out),每个方法为一个栈帧 1 50 %
- Program Counter Register (线程私有):PC寄存器就是一个指针,指向方法区中的方法字节码,每一个线程用于记录当前线程正在执行的字节码指令地址。由执行引擎读取下一条指令.因为线程需要切换,当一个线程被切换回来需要执行的时候,知道执行到哪里了
- Native Method stack (线程私有):本地方法栈为本地方法执行构建的内存空间,存放本地方法执行时的局部变量、操作数等。
Method Area(线程共享)相当于源数据区;
heap(线程共享)相当于建筑图纸,存放了线程所必要的方案;是重点调优内容;
Program Counter Register(线程私有)标记了线程是否使用;
2.内存的由来
在算术复杂的时候, cpu也会将复杂的任务拆解,这时就需要将临时结果找个地方存放一下于是工程师在cpu里设计了寄存器里,将临时结果存在寄存器里。需要的时候在拿出来。那么可以多设计几个寄存器么?答案是不能,因为cpu主要是用来计算,不是用来存储数据,多设计寄存器会加大cpu的开发设计难度,这时这些临时结果就要找个地方存放,这时就产生了内存,由于硬盘,u盘,软盘等设备的数据读取速度太慢,所以内存是最合适的。
内存胜出后,会在内存中专门预留出两块地方用来存储临时数据,我们称为栈和堆
出栈后数据还在这里,此时数据就被称为垃圾
3.虚拟机
目前Oracle官方使用的是HotSpot, 它最早由一家名为"Longview Technologies"公司设计,使用了很多优秀的设计理念和出色的性能,1997年该公司被SUN公司收购。后来随着JDK一起发布了HotSpot VM。目前HotSpot是最主要的 JVM。
安卓程序需要运行在JVM上,而安卓平台使用了Google自研的Java虚拟机——Dalvid,适合于内存、处理器能力有限系统。
在堆内存中如果创建的对象不再使用,仍占用着内存,此时即为垃圾.需要即使进行垃圾回收,从而释放内存空间给其它对象使用
其实不同的开发语言都有垃圾回收问题,C,C++需要程序员人为回收,造成开发难度大,容易出错等问题,但执行效率高,而JAVA和Python中不需要程序员进行人为的回收垃圾,而由JVM或相关程序自动回收垃圾,减轻程序员的开发难度,但可能会造成执行效率低下
堆内存里面经常创建、销毁对象,内存也是经常被使用、被释放。如果不妥善处理,一个使用频繁的进程,可能会出现虽然有足够的内存容量,但是无法分配出可用内存空间,因为没有连续成片的内存了,内存全是碎片化的空间。
所以需要有合适的垃圾回收机制,确保正常释放不再使用的内存空间,还需要保证内存空间尽可能的保持一定的连续
java什么是垃圾,没有被使用的进程、线程称之为垃圾
对于垃圾回收,需要解决的三个问题
- 哪些是垃圾要回收 A计数法(计数为0 就是垃圾) B根搜索法(具体是谁在用 这个进程)
- 怎么回收垃圾
- 什么时候回收垃圾
3.1 Garbage 垃圾确定方法
- 引用计数: 每一个堆内对象上都与一个私有引用计数器,记录着被引用的次数,引用计数清零,该对象所占用堆内存就可以被回收。循环引用的对象都无法将引用计数归零,就无法清除。Python中即使用此种方式。 简单来说就是有个笔记本,记录有没有人在用,缺陷,AB 资源互相调用
- 根搜索(可达)算法 Root Searching
由某个程序(进程)产生的线程是有根的,由资源产生的进程或者线程都是根可达;
如果是从根环境产生的进程或者线程,那么该进程或者线程不是垃圾;反之,则为垃圾。
3.2垃圾回收基本算法
3.2.1标记-清除 Mark-Sweep
分垃圾标记阶段和内存释放阶段。标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆,对未标记对象(即不再使用的对象)逐一进行清理。
标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多,逐一删除效率也会影响)
内存分配的时候要求是连续空间;如果使用内存一定要是连续空间。
3.2.2标记压缩(压实)Mark-Compact
分垃圾标记阶段和内存整理阶段。标记阶段,找到所有可访问对象打个标记。内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。
标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。缺点是内存整理过程有消耗,效率相对低下
3.2.3复制 Copying
先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以效率很高。
3.2.4 多种算法总结
没有最好的算法,在不同场景选择最合适的算法
- 效率: 复制算法>标记清除算法> 标记压缩算法
- 内存整齐度: 复制算法=标记压缩算法> 标记清除算法
- 内存利用率: 标记压缩算法=标记清除算法>复制算法
内存整齐度:会不会产生内存碎片
3.2.5拓展——STW
对于大多数垃圾回收算法而言,GC线程工作时,停止所有工作的线程,称为Stop The World。GC 完成时,恢复其他工作线程运行。这也是JVM运行中最头疼的问题。
4.分代堆内存GC策略
4.1堆内存分代
上述垃圾回收算法都有优缺点,能不能对不同数据进行区分管理,不同分区对数据实施不同回收策略,分而治之
- 堆进一步细化分为:新生代、中生代、老生代
- Java中每新new一个对象所占用的内存空间就是新生代的空间,当Java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代
- 整个JVM堆大小 = 新生代大小 + 老生代大小 + 永久代大小
将heap内存空间分为三个不同类别: 年轻代、老年代、持久代
Heap堆内存分为
- 年轻代Young:Young Generation
- 老年代Tenured:Old Generation
年轻代分区
- 伊甸园区(Eden):只有一个,刚刚创建的对象的新生区域,进程线程新出生的区域,在伊甸园区的进程和线程一般不会产生垃圾;
- 幸存(存活)区(Servivor Space):有2个幸存区,From和To,二者大小相等,地位相同,可进行互换;From是指本次复制数据的源区,To是指本次复制数据的目标区。
默认空间大小比例
规律:一般情况99%的对象都是临时对象
在tomcat 状态页可以看到以下的内存分代 持久代是 元空间 metaspace
4.2年轻代回收Minor GC
- 起始时,所有新建对象(特大对象直接进入老年代)都出生在eden,当eden满了,启动**GC。这个称为Young GC 或者 Minor GC。
- 先标记eden存活对象,然后将存活对象复制到s0(假设本次是s0,也可以是s1,它们可以调换),eden剩余所有空间都清空。GC完成。
- 继续新建对象,当eden再次满了,启动GC。
- 先同时标记eden和s0中存活对象,然后将存活对象复制到s1。将eden和s0清空,此次GC完成
- 继续新建对象,当eden满了,启动GC。
- 先标记eden和s1中存活对象,然后将存活对象复制到s0。将eden和s1清空,此次GC完成以后就重复上面的步骤。
4.2.1年轻代——伊甸园区
伊甸园区:进程和线程的出生区域,新开的进程和线程都由此区域开始;
在新生代区域一段时间后,伊甸园区可能会有未使用的进程或者线程,会产生垃圾
此时需要启动GC,标记存活对象(在使用的进程或者线程(蓝色圆形) )将其复制到s0((假设本次是s0,也可以是s1,它们可以调换) )
4.2.2年轻代——From survivor
此时将伊甸园区的剩余所有空间清空,GC完成
4.2.3年轻代——To survivor
继续新建对象,如果Eden满了,继续启动GC
年轻代回收Minor GC就是如此循环标记清除
通常场景下,大多数对象都不会存活很久,而且创建活动非常多,新生代就需要频繁垃圾回收。但是,如果一个对象一直存活,它最后就在from、to来回复制,如果from区中对象复制次数达到阈值(默认15次,CMS为6次,可通过java的选项 -XX:MaxTenuringThreshold=N 指定),就直接复制到老年代。
4.3老年代回收Major GC
- 进入老年代的数据较少,所以老年代区被占满的速度较慢,所以垃圾回收也不频繁。如果老年代也满了,会触发老年代GC,称为Old GC或者 Major GC。
- 由于老年代对象一般来说存活次数较长,所以较常采用标记-压缩算法。
- 当老年代满时,会触发 Full GC,即对所有"代"的内存进行垃圾回收
- Minor GC比较频繁,Major GC较少。但一般Major GC时,由于老年代对象也可以引用新生代对象,所以先进行一次Minor GC,然后在Major GC会提高效率。可以认为回收老年代的时候完成了一次Full GC。所以可以认为 MajorGC = FullGC
进程或者线程运行一段时候后,由于一直运行,不断的又在产生新的进程和线程,伊甸园区也会不断地更新迭代,在年轻代的一些进程和线程会到老年代,此时老年代也会有进程或者线程退出使用,那么就会产生垃圾,此时需要清理老年代的垃圾。
当老年代满时,会触发Full GC,即对所有“代”的内存进行垃圾回收,老年代中所有进程和线程会统一停一下然后交由老年代的Major GC进行垃圾清理,
5.Java 内存调整相关参数
5.1JVM 内存常用相关参数
Java 命令行参考文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
帮助:man java
5.1.1 Java 选项
选项分类
- 选项名称 此为标准选项,所有HotSpot都支持
- -X选项名称 为稳定的非标准选项
- -XX:选项名称 非标准的不稳定选项,下一个版本可能会取消
[root@localhost ~]#java -h
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 "server" VM
默认 VM 是 server,
因为您是在服务器类计算机上运行。
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 : 分隔的目录, JAR 档案
和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值>
设置系统属性
-verbose:[class|gc|jni]
启用详细输出
-version 输出产品版本并退出
-version:<值>
警告: 此功能已过时, 将在
未来发行版中删除。
需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
警告: 此功能已过时, 将在
未来发行版中删除。
在版本搜索中包括/排除用户专用 JRE
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。
[root@localhost ~]#java -X
-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
设置搜索路径以引导类和资源
-Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
附加在引导类路径末尾
-Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc:<file> 将 GC 状态记录在文件中 (带时间戳)
-Xbatch 禁用后台编译
-Xms<size> 设置初始 Java 堆大小
-Xmx<size> 设置最大 Java 堆大小
-Xss<size> 设置 Java 线程堆栈大小
-Xprof 输出 cpu 配置文件数据
-Xfuture 启用最严格的检查, 预期将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用 (请参阅文档)
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据 (默认)
-Xshare:on 要求使用共享类数据, 否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:all
显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
显示所有属性设置并继续
-XshowSettings:locale
显示所有与区域设置相关的设置并继续
-X 选项是非标准选项, 如有更改, 恕不另行通知。
参数 | 说明 | 举例 |
---|---|---|
-Xms | 设置应用程序初始使用的堆内存大小(年轻代+老年代) | -Xms2g |
-Xmx | 设置应用程序能获得的最大堆内存早期JVM不建议超过32G,内存管理效率下降 | -Xms4g |
-XX:NewSize | 设置初始新生代大小 | -XX:NewSize=128m |
-XX:MaxNewSize | 设置最大新生代内存空间 | -XX:MaxNewSize=256m |
-Xmnsize | 同时设置-XX:NewSize 和 -XX:MaxNewSize,代 | -Xmn1g |
-XX:NewRatio | 以比例方式设置新生代和老年代 | -XX:NewRatio=2new/old=1/2 |
-XX:SurvivorRatio | 以比例方式设置eden和survivor(S0或S1) | -XX:SurvivorRatio=6eden/survivor=6/1new/survivor=8/1 |
-Xss | 设置每个线程私有的栈空间大小,依据具体线程 | -Xss256k |
建议将初始使用的堆内存大小(Xms)和最大堆内存大小(Xmx)设置为一样
#有不稳定选项的当前生效值
[root@localhost ~]#java -XX:+PrintFlagsFinal
#查看所有不稳定选项的默认值
[root@localhost ~]#java -XX:+PrintFlagsInitial
5.1.2示例——调试java heap
[root@localhost ~]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
Heap.java
[root@localhost opt]#javac Heap.java
[root@localhost opt]#ls
Heap.class Heap.java
[root@localhost opt]#echo $CLASSPATH
/usr/local/jdk/lib/:/usr/local/jdk/jre/lib/
java -Xms1024m -Xmx1024m -XX:+PrintGCDetails -cp . Heap
#指定内存空间大小
max=1029177344字节 981.5MB
total=1029177344字节 981.5MB
Heap
PSYoungGen total 305664K, used 10486K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000)
eden space 262144K, 4% used [0x00000000eab00000,0x00000000eb53d888,0x00000000fab00000)
from space 43520K, 0% used [0x00000000fd580000,0x00000000fd580000,0x0000000100000000)
to space 43520K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000fd580000)
ParOldGen total 699392K, used 0K [0x00000000c0000000, 0x00000000eab00000, 0x00000000eab00000)
object space 699392K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000eab00000)
Metaspace used 2528K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 269K, capacity 386K, committed 512K, reserved 1048576K
5.1.3Tomcat heap调优
默认不指定,-Xmx大约使用了四分之一的内存
[root@localhost ~]#cd /usr/local/tomcat/bin/
[root@localhost bin]#ls
bootstrap.jar configtest.sh shutdown.sh
catalina.bat daemon.sh startup.bat
catalina.sh digest.bat startup.sh
catalina-tasks.xml digest.sh tomcat-juli.jar
ciphers.bat makebase.bat tomcat-native.tar.gz
ciphers.sh makebase.sh tool-wrapper.bat
commons-daemon.jar setclasspath.bat tool-wrapper.sh
commons-daemon-native.tar.gz setclasspath.sh version.bat
configtest.bat shutdown.bat version.sh
[root@localhost bin]#vim catalina.sh
-server:服务器模式
-Xms:堆内存初始化大小
-Xmx:堆内存空间上限
-XX:NewSize=:新生代空间初始化大小
-XX:MaxNewSize=:新生代空间最大值
[root@localhost bin]#systemctl restart tomcat
5.1.4查看OOM(Out Of Memory)——JDK工具监控使用情况
[root@localhost opt]#ls
Heap.class Heap.java
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
Heap.class Heap.java HeapOom2.java
[root@localhost opt]#javac HeapOom2.java
[root@localhost opt]#ls
Heap.class Heap.java HeapOom2.class HeapOom2.java
[root@localhost opt]#java -cp . HeapOom2
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:674)
at java.lang.StringBuilder.append(StringBuilder.java:208)
at HeapOom2.main(HeapOom2.java:6)
使用MobaXterm连接
[root@localhost ~]#export DISPLAY=192.168.241.11:0.0
[root@localhost ~]#yum -y install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1
[root@localhost ~]#which jvisualvm
/usr/local/jdk/bin/jvisualvm
[root@localhost ~]#jvisualvm
5.1.5 Jvisualvm
[root@localhost opt]#ls
Heap.class Heap.java HeapOom2.class HeapOom2.java
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
Heap.class Heap.java HeapOom2.class HeapOom2.java HeapOom.java
[root@localhost opt]#javac HeapOom.java
[root@localhost opt]#ls
Heap.class HeapOom2.class HeapOom.class
Heap.java HeapOom2.java HeapOom.java
[root@localhost opt]#java -cp . -Xms5m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError HeapOom
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid8578.hprof ...
Heap dump file created [7088230 bytes in 0.010 secs]
java.lang.OutOfMemoryError: Java heap space
at HeapOom.main(HeapOom.java:12)
count=7
5.1.6 Jprofiler——定位OOM问题原因
JProfiler是一款功能强大的Java开发分析工具,它可以快速的帮助用户分析出存在的错误,软件还可对需要的显示类进行标记,包括了内存的分配情况和信息的视图等
JProfiler官网:http://www.ej-technologies.com/products/jprofiler/overview.html
java -cp . -Xms5m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError HeapOom
二、Tomcat调优
Tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。
#Tomcat 配置文件参数优化##
常用的优化相关参数如下:
【redirectPort】如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS 443 请求时,则转发至此属性定义的 8443 端口。
【maxThreads】Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大的线程数,即支持的最大并发连接数,默认值是 200。
【minSpareThreads】最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。
【maxSpareThreads】最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制)。一般不需要指定。
【processorCache】进程缓冲器,可以提升并发请求。默认值是200,如果不做限制的话可以设置为-1,一般采用maxThreads的值或者-1。
【URIEncoding】指定 Tomcat 容器的 URL 编码格式,网站一般采用UTF-8作为默认编码。
【connnectionTimeout】网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以。
【enableLookups】是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为 false,则直接返回 IP 地址,为了提高处理能力,应设置为 false。
【disableUploadTimeout】上传时是否使用超时机制。应设置为 true。
【connectionUploadTimeout】上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
【acceptCount】指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为 100 个。
【maxKeepAliveRequests】指定一个长连接的最大请求数。默认长连接是打开的,设置为1时,代表关闭长连接;为-1时,代表请求数无限制
【compression】是否对响应的数据进行GZIP压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为 off,压缩数据后可以有效的减少页面的大小,一般可以减小 1/3 左右,节省带宽。
【compressionMinSize】表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是 2048。
【compressableMimeType】压缩类型,指定对哪些类型的文件进行数据压缩。
【noCompressionUserAgents="gozilla, traviata"】对于以下的浏览器,不启用压缩
#如果已经进行了动静分离处理,静态页面和图片等数据就不需做 Tomcat 处理,也就不要在 Tomcat 中配置压缩了。
以上是一些常用的配置参数,还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与 AJP Connector 的参数属性值,可以参考官方文档的详细说明进行学习。
vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/11.1"
connectionTimeout="20000"
redirectPort="8443"
--71行--插入
minSpareThreads="50"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="300"
maxThreads="500"
processorCache="500"
URIEncoding="UTF-8"
maxKeepAliveRequests="100"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png"/>
三、Tomcat多实例——反向代理多机
1.Nginx代理服务器及静态资源Web服务器配置
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum install nginx -y
[root@localhost ~]#vim /etc/nginx/nginx.conf
[root@localhost ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost ~]#nginx -s reload
nginx: [error] invalid PID number "" in "/run/nginx.pid"
[root@localhost ~]#systemctl start nginx
[root@localhost ~]#nginx -s reload
[root@localhost ~]#mkdir /opt/html
[root@localhost ~]#vim /opt/html/test.html
[root@localhost ~]#cat /opt/html/test.html
test test
2.Tomcat动态资源服务器配置
[root@node2 ~]#systemctl stop firewalld
[root@node2 ~]#setenforce 0
[root@node2 ~]#cd /opt
[root@node2 opt]#rz -E
rz waiting to receive.
[root@node2 opt]#rz -E
rz waiting to receive.
[root@node2 opt]#ls
apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@node2 opt]#tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@node2 opt]#cd /usr/local/
[root@node2 local]#ls
bin games jdk1.8.0_291 lib64 nginx share
etc include lib libexec sbin src
[root@node2 local]#ln -s jdk1.8.0_291/ jdk
[root@node2 local]#ls
bin games jdk lib libexec sbin src
etc include jdk1.8.0_291 lib64 nginx share
[root@node2 local]#vim /etc/profile.d/jdk.sh
[root@node2 local]#cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
[root@node2 local]#. /etc/profile.d/jdk.sh
[root@node2 local]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@node2 local]#cd /opt
[root@node2 opt]#tar xf apache-tomcat-9.0.16.tar.gz -C /usr/local/
[root@node2 opt]#cd /usr/local/
[root@node2 local]#ls
apache-tomcat-9.0.16 etc include jdk1.8.0_291 lib64 nginx share
bin games jdk lib libexec sbin src
[root@node2 local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@node2 local]#ls
apache-tomcat-9.0.16 games jdk1.8.0_291 libexec share
bin include lib nginx src
etc jdk lib64 sbin tomcat
[root@node2 local]#useradd tomcat -s /sbin/nologin -M
[root@node2 local]#chown tomcat:tomcat tomcat/ -R
[root@node2 local]#ll
total 0
drwxr-xr-x. 9 tomcat tomcat 220 Mar 4 02:08 apache-tomcat-9.0.16
drwxr-xr-x. 2 root root 6 Nov 5 2016 bin
drwxr-xr-x. 2 root root 6 Nov 5 2016 etc
drwxr-xr-x. 2 root root 6 Nov 5 2016 games
drwxr-xr-x. 2 root root 6 Nov 5 2016 include
lrwxrwxrwx. 1 root root 13 Mar 4 02:06 jdk -> jdk1.8.0_291/
drwxr-xr-x. 8 10143 10143 273 Apr 7 2021 jdk1.8.0_291
drwxr-xr-x. 2 root root 6 Nov 5 2016 lib
drwxr-xr-x. 2 root root 6 Nov 5 2016 lib64
drwxr-xr-x. 2 root root 6 Nov 5 2016 libexec
drwxr-xr-x. 11 root root 151 Feb 25 02:02 nginx
drwxr-xr-x. 2 root root 6 Nov 5 2016 sbin
drwxr-xr-x. 5 root root 49 Dec 18 08:36 share
drwxr-xr-x. 3 root root 26 Feb 25 02:02 src
lrwxrwxrwx. 1 root root 21 Mar 4 02:08 tomcat -> apache-tomcat-9.0.16/
[root@node2 local]#vim /usr/lib/systemd/system/tomcat.service
[root@node2 local]#cat /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecrStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@node2 local]#systemctl daemon-reload
[root@node2 local]#systemctl start tomcat
[root@node2 local]#systemctl status tomcat
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2024-03-04 02:15:48 EST; 4s ago
Process: 2204 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 2219 (catalina.sh)
CGroup: /system.slice/tomcat.service
├─2219 /bin/sh /usr/local/tomcat/bin/catalina.sh start
└─2220 /usr/bin/java -Djava.util.logging.config.file=/usr/local...
Mar 04 02:15:48 node2.localdomain systemd[1]: [/usr/lib/systemd/system/to...'
Mar 04 02:15:48 node2.localdomain systemd[1]: Starting Tomcat...
Mar 04 02:15:48 node2.localdomain systemd[1]: Started Tomcat.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node2 local]#cd tomcat/webapps/ROOT/
[root@node2 ROOT]#ls
asf-logo-wide.svg bg-upper.png tomcat.css tomcat.svg
bg-button.png favicon.ico tomcat.gif WEB-INF
bg-middle.png index.jsp tomcat.png
bg-nav.png RELEASE-NOTES.txt tomcat-power.gif
[root@node2 ROOT]#vim test.jsp
[root@node2 ROOT]#cat test.jsp
cxk
[root@node3 ~]#systemctl stop firewalld
[root@node3 ~]#setenforce 0
[root@node3 ~]#cd /opt
[root@node3 opt]#rz -E
rz waiting to receive.
[root@node3 opt]#rz -E
rz waiting to receive.
[root@node3 opt]#ls
apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@node3 opt]#tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@node3 opt]#cd /usr/local/
[root@node3 local]#ls
bin games jdk1.8.0_291 lib64 sbin src
etc include lib libexec share
[root@node3 local]#ln -s jdk1.8.0_291/ jdk
[root@node3 local]#ls
bin games jdk lib libexec share
etc include jdk1.8.0_291 lib64 sbin src
[root@node3 local]#vim /etc/profile.d/jdk.sh
[root@node3 local]#cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
[root@node3 local]#. /etc/profile.d/jdk.sh
[root@node3 local]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@node3 local]#cd /opt
[root@node3 opt]#tar xf apache-tomcat-9.0.16.tar.gz -C /usr/local/
[root@node3 opt]#cd /usr/local/
[root@node3 local]#ls
apache-tomcat-9.0.16 etc include jdk1.8.0_291 lib64 sbin src
bin games jdk lib libexec share
[root@node3 local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@node3 local]#ls
apache-tomcat-9.0.16 etc include jdk1.8.0_291 lib64 sbin src
bin games jdk lib libexec share tomcat
[root@node3 local]#useradd tomcat -s /sbin/nologin -M
[root@node3 local]#chown tomcat:tomcat tomcat/ -R
[root@node3 local]#ll
总用量 0
drwxr-xr-x. 9 tomcat tomcat 220 3月 4 15:08 apache-tomcat-9.0.16
drwxr-xr-x. 2 root root 6 11月 5 2016 bin
drwxr-xr-x. 2 root root 6 11月 5 2016 etc
drwxr-xr-x. 2 root root 6 11月 5 2016 games
drwxr-xr-x. 2 root root 6 11月 5 2016 include
lrwxrwxrwx. 1 root root 13 3月 4 15:06 jdk -> jdk1.8.0_291/
drwxr-xr-x. 8 10143 10143 273 4月 8 2021 jdk1.8.0_291
drwxr-xr-x. 2 root root 6 11月 5 2016 lib
drwxr-xr-x. 2 root root 6 11月 5 2016 lib64
drwxr-xr-x. 2 root root 6 11月 5 2016 libexec
drwxr-xr-x. 2 root root 6 11月 5 2016 sbin
drwxr-xr-x. 5 root root 49 1月 13 23:33 share
drwxr-xr-x. 2 root root 6 11月 5 2016 src
lrwxrwxrwx. 1 root root 21 3月 4 15:08 tomcat -> apache-tomcat-9.0.16/
[root@node3 local]#vim /usr/lib/systemd/system/tomcat.service
[root@node3 local]#cat /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecrStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@node3 local]#systemctl daemon-reload
[root@node3 local]#systemctl start tomcat
[root@node3 local]#systemctl status tomcat
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
Active: active (running) since 一 2024-03-04 15:15:47 CST; 4s ago
Process: 2541 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 2557 (catalina.sh)
CGroup: /system.slice/tomcat.service
├─2557 /bin/sh /usr/local/tomcat/bin/catalina.sh start
└─2558 /usr/bin/java -Djava.util.logging.config.file=/usr/local...
3月 04 15:15:47 node3.node3 systemd[1]: [/usr/lib/systemd/system/tomcat....'
3月 04 15:15:47 node3.node3 systemd[1]: Starting Tomcat...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CATALINA_BASE: /usr...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CATALINA_HOME: /usr...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CATALINA_TMPDIR: /usr...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using JRE_HOME: /usr
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CLASSPATH: /usr...
3月 04 15:15:47 node3.node3 systemd[1]: Started Tomcat.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node3 local]#cd tomcat/webapps/ROOT/
[root@node3 ROOT]#ls
asf-logo-wide.svg bg-upper.png tomcat.css tomcat.svg
bg-button.png favicon.ico tomcat.gif WEB-INF
bg-middle.png index.jsp tomcat.png
bg-nav.png RELEASE-NOTES.txt tomcat-power.gif
[root@node3 ROOT]#vim test.jsp
[root@node3 ROOT]#cat test.jsp
wyb