tomcat类加载&优化

2021-02-24  本文已影响0人  左师兄zuosx

1. 类加载机制分析

Java类(.java) --> 字节码文件(.class)--> 字节码文件需要被加载到JVM内存中(这个过程就是一个类加载的过程)

类加载器(ClassLoader,说白了也是一个类),jvm启动的时候先把类加载器读取到内存中去。

1.1 JVM类加载机制

jvm类加载机制中有一个非常重要的角色叫做类加载器(ClassLoader),类加载器有自己的体系。JVM内置了几种类加载器:引导类加载器,扩展类加载器,系统类加载器,他们之间形成父子关系,通过Parent属性来定义这种关系,最终形成树形结构

image-20200618085533750.png
类加载器 作用
引导类加载器<br />BootstrapClassLoader c++编写,加载java核心库java.*,比如rt.jar中的类。构造ExtClassLoader和APPClassLoader
扩展类加载器<br />ExtClassLoader java编写,加载扩展库JAVA_HOME/lib/ext目录下的jar中的类,如classpath中的jre,javax.*或者java.ext.dir指定位置中的类
系统类加载器<br />SystemClassLoader/AppClassLoader 默认的类加载器,搜索环境变量classpath中指明的路径

另外:用户可以自定义类加载器(Java编写,用户自定义的类加载器,可加载指定路径的class文件)

    当JVM运行过程中,用户自定义了类加载器去加载某些类时,会按照以下的步骤(父类委托机制)

1)用户自己的类加载器,把加载请求传给父类加载器,父加载器再传给其父加载器,一直到加载器树的顶层

2)最顶层的类加载器首先针对其特定的位置加载,如果加载不到就转交给子类

3)如果一直到底层的类加载器都没有加载到,那么就会抛出异常ClassNotFoundException

因此,按照这个过程可以想到,如果同样在 classpath 指定的目录中和自己工作的目录中存放相同的class,会优先加载 classpath 目录中的文件

1.2 双亲委派机制

1.2.1 什么是双亲委派机制

当某个类加载器需要加载某个 .class 文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。

1.2.2 双亲委派机制的作用

1.3 Tomcat 的类加载机制

Tomcat 的类加载机制相对于 JVM 的类加载机制做了一些改变。

没有严格的遵从双亲委派机制,也可以说打破了双亲委派机制。

比如:有一个tomcat,webapps下部署了两个应用

app1/lib/a-1.0.jar com.app.Abc

app2/lib/a-2.0.jar com.app.Abc

不同的版本中Abc类的内容是不同的,代码是不一样的。如果完全遵从双亲委派机制,两个应用下Abc只会被加载一个,这样就是有问题的。

image-20200618092516674.png

2. Tomcat 优化性能策略

系统性能的衡量指标,主要是响应时间和吞吐量。

响应时间:执行某个操作的耗时。

吞吐量:系统在给定时间内能够支持的事务数量,单位为TPS(Transactions PerSencod的缩写,也就是事务数/秒,一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程)。

Tomcat 优化从两方面进行

1)JVM虚拟机优化(优化内存模型)

2)Tomcat 自身配置优化(比如是否使用共享线程池?IO模型?)

优化原则:

优化是一个过程,没有明确的参数值供使用,必须根据自己的真实生产环境来进行调整。

2.1 虚拟机运行优化

Java 虚拟机的运行优化主要分为内存分配和垃圾回收策略的优化:

2.1.1 Java 虚拟机内存相关参数

参数 参数作用 优化建议
-server 启动server,以服务端模式运行 服务端模式建议开启
-Xms 最小堆内存 建议与-Xmx设置相同
-Xmx 最大堆内存 建议设置为可用内存的80%
-XX:MetaspaceSize 元空间初始值
-XX:MaxMetaspaceSize 元空间最大内存 默认无线
-XX:NewRatio 年轻代和老年代大小比值,取值为整数,默认2 不需要修改
-XX:SurvivorRatio Eden区和Survivor区大小的比值,取值为整数,默认8 不需要修改

java内存模型

image-20200618100717019.png

参数调整示例

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"

调整后查看可以使用JDK提供的内存映射工具查看Tomcat中JVM的内存配置

jhsdb jmap --heap --pid xxxx

2.1.2 垃圾回收(GC)策略

垃圾回收性能指标

垃圾收集器

垃圾回收参数

参数 描述
-XX:+UseSerialGC 启用串行收集器
-XX:+UseParallelGC 启用并行收集器,配置了该选项,那么 -XX:+UseParallelOldGC 默认启用
-XX:+UseParNewGC 年轻代请用并行收集器,如果设置了 -XX:+UseConcMarkSweepGC 选项,自动启动
-XX:ParallelGCThreads 年轻代以及老年代垃圾回收使用的线程数。默认值依赖于JVM使用的CPU个数
-XX:+UseConcMarkSweepGC(CMS) 对应老年代,启用CMS垃圾收集器。当并行收集器无法满足应用的延迟需求时,推荐使用CMS或G1收集器。启用该选项后,-XX:+UseParallelGC 自动启用
-XX:+UseG1GC 启用G1收集器,G1是服务器类型的收集器,用于多核、大内存的机器。它在保持高吞吐量的情况下,高概率的满足GC暂停时间的目标

在 bin/catalina.sh 的脚步中,追加配置:

JAVA_OPTS="-XX:+UseConcMarkSweepGC"

2.2 Tomcat 配置优化

Tomcat 自身相关优化

2.2.1 调整tomcat线程池

image-20200618103547618.png

2.2.2 调整tomcat的连接器

image-20200618103555774.png

2.2.3 禁用AJP连接器

image-20200618103604906.png

2.2.4 调整IO模型

image-20200618103616998.png

2.2.5 动静分离

image-20200618103624732.png
上一篇下一篇

猜你喜欢

热点阅读