Tomcat学习积累笔记—Tomcat性能优化策略
1.JVM内存模型回顾
Java 虚拟机的运⾏优化主要是内存分配
和垃圾回收策略
的优化:
1.内存直接影响服务的运⾏效率和吞吐量
2.垃圾回收机制会不同程度地导致程序运⾏中断(垃圾回收策略不同,垃圾回收次数和回收效率都是不同的)
- 本地方法栈:C++,Native方法运行内容存放的栈区
- 程序计数器:对程序运行到那个位置进行记录,指向程序运行位置
- 1和2基本不需要改动
- 栈:存储的一些函数运行时的临时变量
- 方法区(元数据空间):这里面存储的一些元数据信息,指的是一些比较全局的东西
(静态方法 ,变量 ,类加载器)
- 堆:JVM调优主要调整就是堆,堆分为年轻代和老年代
3. Java 虚拟机内存相关参数
4. 参数调整示例:
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
配置如图,在Catalina.sh中:
5. 调整后查看可使⽤JDK提供的内存映射⼯具
2. 垃圾回收(GC)策略:主要是针对堆的
- 垃圾回收性能指标
- 吞吐量:⼯作时间(排除GC时间)占总时间的百分⽐, ⼯作时间并不仅是程序运⾏的时间,还包含内存分配时间。
- 暂停时间:由垃圾回收导致的应⽤程序停⽌响应次数/时间。
3. 垃圾收集器
-
串⾏收集器(Serial Collector)
单线程执⾏所有的垃圾回收⼯作, 适⽤于单核CPU服务器
工作流程
:⼯作进程-----|(单线程)垃圾回收线程进⾏垃圾收集|—⼯作进程继续 -
并⾏收集器(Parallel Collector)
⼜称为吞吐量收集器(关注吞吐量)
, 以并⾏的⽅式执⾏年轻代的垃圾回收, 该⽅式可以显著降低垃圾回收的开销(指多条垃圾收集线程并⾏⼯作,但此时⽤户线程仍然处于等待状态)
。适⽤于多处理器或多线程硬件上运⾏的数据量较⼤的应⽤
工作流程
:⼯作进程-----|(多线程)垃圾回收线程进⾏垃圾收集|—⼯作进程继续 -
并发收集器(Concurrent Collector)
以并发的⽅式执⾏⼤部分垃圾回收⼯作,以缩短垃圾回收的暂停时间。适⽤于那些响应时间优先于吞吐量的应⽤, 因为该收集器虽然最⼩化了暂停时间(指⽤户线程与垃圾收集线程同时执⾏,但不⼀定是并⾏的,可能会交替进⾏), 但是会降低应⽤程序的性能 -
CMS收集器(Concurrent Mark Sweep Collector)
并发标记清除收集器, 适⽤于那些更愿意缩短垃圾回收暂停时间并且负担的起与垃圾回收共享处理器资源的应⽤ -
G1收集器(Garbage-First Garbage Collector)
适⽤于⼤容量内存的多核服务器, 可以在满⾜垃圾回收暂停时间⽬标的同时, 以最⼤可能性实现⾼吞吐量(JDK1.7之后)
4. 垃圾回收器参数
在bin/catalina.sh的脚本中 , 追加如下配置 :
JAVA_OPTS="-XX:+UseConcMarkSweepGC"
,配置垃圾回收机制
5. Tomcat 配置调优
1. Tomcat⾃身相关的调优
-
调整tomcat线程池
:使所有tomcat
共用一个线程池,定义好线程池,那么在Connector中就可以使用了
-
调整tomcat的连接器
:调整tomcat/conf/server.xml 中关于链接器的配置可以提升应⽤服务器的性能。
-
禁⽤
AJP
连接器
-
调整 IO 模式
:Tomcat8之前的版本默认使⽤BIO(阻塞式IO),对于每⼀个请求都要创建⼀个线程来处理,不适合⾼并发;Tomcat8以后的版本默认使⽤NIO模式(⾮阻塞式IO)
当Tomcat并发性能有较⾼要求或者出现瓶颈时,我们可以尝试使⽤APR模式,APR(Apache PortableRuntime)是从操作系统级别解决异步IO问题,使⽤时需要在操作系统上安装APR和Native(因为APR原理是使⽤使⽤JNI技术调⽤操作系统底层的IO接⼝)
-
动静分离
:可以使⽤Nginx+Tomcat相结合的部署⽅案,Nginx负责静态资源访问,Tomcat负责Jsp等动态资源访问处理(因为Tomcat不擅⻓处理静态资源)。