Tomcat优化笔记

栏目: Java · 发布时间: 6年前

内容简介:好记性不如烂笔头,记录下来作为以后每次优化时的依据,也许对遇到类似问题的你也略有启发吧。一千个人眼中就有一千个哈姆雷特。——关于

好记性不如烂笔头,记录下来作为以后每次优化时的依据,也许对遇到类似问题的你也略有启发吧。

Tomcat优化笔记

一千个人眼中就有一千个哈姆雷特。—— 伪西方谚语

关于 Tomcat 的优化点之多,我估计没有上万,也有成千。不同的应用场景,不同的架构,不同的需求,都会对优化设置有不同要求。在这里我所记述的只是我自己在一些 Tomcat 应用中所设置的优化项,以备不时之需,并不是放之四海而皆准的准则。

pom.xml

对于 maven 项目来说, pom.xml 设置是整个设置的核心,如果 pom.xml 设置不当,虽然有时候也可以编译运行,但总是会出现一些令人讨厌的警告。为了消除这些警告,还需要根治 pom.xml

重复依赖

首先要解决的是重复依赖问题,有时候我们会在编译项目时遇到下面的这样的警告:

[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.qiban.supplier:saas-supplier:war:1.0-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: commons-codec:commons-codec:jar -> duplicate declaration of version 1.9 @ line 264, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

解决的方法很简单:在 pom.xml 中搜索出现重复依赖的 jar 包名称,你肯定会发现对于同一个 jar 包,重复引用了多次,也许版本相同,也许版本不同,只要删除掉那些重复的就可以了。

maven 编译器版本

有时候会遇到下面这样的错误:

[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.qiban.supplier:saas-supplier:war:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 297, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

这意思是说你没有在 pom.xml 里指定 maven 的版本,在 pom.xml 里添加 maven 的版本就可以了:

<build>
        <finalName>saas-supplier</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

重点是上面那个 <version>3.5.1</version>

jdom

有的时候会遇到一行简单的警告:

[WARNING] The artifact jdom:jdom:jar:1.1 has been relocated to org.jdom:jdom:jar:1.1

这个的意思是说在你的 pom.xml 里,你需要把 jdomgroupId 改为 org.jdom

<dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.1</version>
        </dependency>

activemq-spring

下面这个警告不会在编译时出现,但是会在运行时出现,也非常恶心:

SLF4J: Class path contains multiple SLF4J bindings

我们需要把 pom.xml 里的 activemq-all 改成 activemq-spring

<dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-spring</artifactId>
            <version>5.11.1</version>
        </dependency>

详细解释可以看我的 这篇文章

log4j.properties

终于改完了 pom.xml ,我们开始处理 log4j。

xmemcached

如果你使用了 xmemcached ,那么日志里会不断地出现 xmemcached 的警告,而这些警告对我们来说根本就不是警告,毫无意义,并且会掩盖真正的错误,所以我们通过修改 log4j.properties 文件屏蔽它:

# xmemcached
log4j.logger.com.google.code=OFF
log4j.logger.net.rubyeye.xmemcached=OFF

我这里比较野蛮粗暴地直接使用了 OFF 选项,如果你不放心,可以改成 ERROR 选项,效果是一样的。

webapp 名称+%c

如果你有多个 webapp ,为了准确显示到底是哪个 webapp 的哪个 class 报的错,我们需要在 log4j.properties 文件里注明我们的 webapp 名称,再加上一个%c 符号:

log4j.appender.STDOUT.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p - activity - %c - %m%n

这样下回再有任何错误,我们可以第一时间迅速定位到到底是哪个 webapp 的哪个 class 出的错误。

logrotate

如果我们不管不顾的话, Tomcat 的日志文件几乎会无限制增长,最终会耗尽我们的硬盘空间,所以我们需要用 logrotate 来限制它一下,在 /etc/logrotate.d 文件夹下创建一个文件 tomcat

/opt/tomcat1/logs/catalina.out
/opt/tomcat2/logs/catalina.out
{
   copytruncate
   daily
   rotate 7
   compress
   missingok
   size 10M
}

setenv.sh

Tomcat 不问青红皂白,上来就要占领我们主机整个物理内存的四分之一,我们需要限制它的大小,宁可浪费一些 CPU 和硬盘的时间去让它不断地垃圾回收,也不想让它占用这么多的内存,所以我们需要在 /opt/tomcat/bin 下建立一个 setenv.sh 文件,强制让它最多占用 1G 内存:

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx1024m"

这样我们一台 16G 内存的主机,可以同时运行 16Tomcat ,而不像以前,最多只能同时运行 4Tomcat

jarsToSkip

Tomcat 启动时会不断地扫描所有 .jar 文件,并且报一些不知所谓的警告:

09-Dec-2017 20:03:14.289 FINE [localhost-startStop-1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan No TLD files were found in [file:/home/apache-tomcat-8.5.4/lib/tomcat-redis-session-manager-master-2.0.0.jar]. Consider adding the JAR to the tomcat.util.scan.StandardJarScanFilter.jarsToSkip property in CATALINA_BASE/conf/catalina.properties file.

直接在 /opt/tomcat/conf/catalina.properties 文件里把这一句话改成:

tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar

这个世界终于清静了,扫什么扫,有什么可扫的!

startStopThreads

当你有多个 webapp 的时候, Tomcat 缺省会启完一个 webapp 再启下一个,这样太慢了,不可忍受,我们在 /opt/tomcat/conf/server.xml 文件里把它的启动线程数直接干到 20 个:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" startStopThreads="20" />

Dubbo

有时候 Dubbo 也会跳出来捣乱,在每一个不同的 webapp 下的 consumer.xml 文件里指定 file

<dubbo:registry address="zookeeper://${zookeeper.address}" file="${dubbo.cache}" />

每个 webappfile 名称各不相同,它们再也不会互相打架了。

结语

以上所述也不过只是冰山之一角,好记性不如烂笔头,记录下来作为以后每次优化时的依据,也许对遇到类似问题的你也略有启发吧。


以上所述就是小编给大家介绍的《Tomcat优化笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Is Parallel Programming Hard, And, If So, What Can You Do About

Is Parallel Programming Hard, And, If So, What Can You Do About

Paul E. McKenney

The purpose of this book is to help you understand how to program shared-memory parallel machines without risking your sanity.1 By describing the algorithms and designs that have worked well in the pa......一起来看看 《Is Parallel Programming Hard, And, If So, What Can You Do About 》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器