Tomcat性能优化以及 jvm 参数设置

发布时间 2023-09-22 14:12:03作者: lclc

linux ps 命令的结果中 VSZ,RSS,STAT 的含义和大小

参数名含义单位
USER 进程所属用户  
PID 进程ID  
%CPU 进程占用CPU百分比  
%MEM 进程占用内存百分比  
VSZ 虚拟内存占用大小 单位:kb(killobytes)
RSS 实际内存占用大小 单位:kb(killobytes)
TTY 终端类型  
STAT 进程状态  
START 进程启动时刻  
TIME 进程运行时长  
COMMAND 启动进程的命令

查看 utomcat 运行的 java 程序

1
ps aux|head -1; ps aux | grep java | grep utomcat | sort -k4nr | head -10

示例

1
2
3
4
5
6
7
8
[root@hjweb01 script]# ps aux|head -1; ps aux | grep java | grep utomcat | sort -k4nr | head -10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
utomcat 13545 1.6 14.4 3571532 562676 pts/1 Sl 13:31 0:45 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/pre/webLoadBalance/web2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/pre/webLoadBalance/web2/bin/bootstrap.jar:/home/utomcat/tomcat/pre/webLoadBalance/web2/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/pre/webLoadBalance/web2 -Dcatalina.home=/home/utomcat/tomcat/pre/webLoadBalance/web2 -Djava.io.tmpdir=/home/utomcat/tomcat/pre/webLoadBalance/web2/temp org.apache.catalina.startup.Bootstrap start
utomcat 13777 1.5 14.0 3565988 544356 pts/5 Sl 13:34 0:41 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/pre/backend/schedule/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/pre/backend/schedule/bin/bootstrap.jar:/home/utomcat/tomcat/pre/backend/schedule/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/pre/backend/schedule -Dcatalina.home=/home/utomcat/tomcat/pre/backend/schedule -Djava.io.tmpdir=/home/utomcat/tomcat/pre/backend/schedule/temp org.apache.catalina.startup.Bootstrap start
utomcat 32454 0.3 13.8 3563932 535848 ? Sl 10:21 0:54 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/webLoadBalance/web1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/webLoadBalance/web1/bin/bootstrap.jar:/home/utomcat/tomcat/webLoadBalance/web1/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/webLoadBalance/web1 -Dcatalina.home=/home/utomcat/tomcat/webLoadBalance/web1 -Djava.io.tmpdir=/home/utomcat/tomcat/webLoadBalance/web1/temp org.apache.catalina.startup.Bootstrap start
utomcat 22929 0.1 13.5 3593488 524296 ? Sl Jul24 2:02 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/webLoadBalance/web2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/webLoadBalance/web2/bin/bootstrap.jar:/home/utomcat/tomcat/webLoadBalance/web2/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/webLoadBalance/web2 -Dcatalina.home=/home/utomcat/tomcat/webLoadBalance/web2 -Djava.io.tmpdir=/home/utomcat/tomcat/webLoadBalance/web2/temp org.apache.catalina.startup.Bootstrap start
utomcat 13981 1.5 13.3 3563932 519680 pts/1 Sl 13:36 0:40 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/pre/webLoadBalance/web1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/pre/webLoadBalance/web1/bin/bootstrap.jar:/home/utomcat/tomcat/pre/webLoadBalance/web1/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/pre/webLoadBalance/web1 -Dcatalina.home=/home/utomcat/tomcat/pre/webLoadBalance/web1 -Djava.io.tmpdir=/home/utomcat/tomcat/pre/webLoadBalance/web1/temp org.apache.catalina.startup.Bootstrap start
utomcat 15263 0.1 6.6 3568036 259860 ? Sl Jul19 12:08 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/backend/schedule/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/backend/schedule/bin/bootstrap.jar:/home/utomcat/tomcat/backend/schedule/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/backend/schedule -Dcatalina.home=/home/utomcat/tomcat/backend/schedule -Djava.io.tmpdir=/home/utomcat/tomcat/backend/schedule/temp org.apache.catalina.startup.Bootstrap start

查看 utomcat 运行的 java 程序,同时程序目录带 pre

1
ps aux|head -1; ps aux | grep java | grep utomcat | grep pre | sort -k4nr | head -10

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@hjweb01 script]# ps aux|head -1; ps aux | grep java | grep utomcat | grep pre | sort -k4nr | head -10  
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
utomcat 21006 20.8 8.4 2923740 326200 pts/9 Sl 15:05 0:35 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/pre/webLoadBalance/web2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms350M -Xmx350M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/pre/webLoadBalance/web2/bin/bootstrap.jar:/home/utomcat/tomcat/pre/webLoadBalance/web2/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/pre/webLoadBalance/web2 -Dcatalina.home=/home/utomcat/tomcat/pre/webLoadBalance/web2 -Djava.io.tmpdir=/home/utomcat/tomcat/pre/webLoadBalance/web2/temp org.apache.catalina.startup.Bootstrap start
utomcat 20706 10.7 8.3 2923740 325332 pts/5 Sl 15:02 0:36 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/pre/webLoadBalance/web1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms350M -Xmx350M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/pre/webLoadBalance/web1/bin/bootstrap.jar:/home/utomcat/tomcat/pre/webLoadBalance/web1/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/pre/webLoadBalance/web1 -Dcatalina.home=/home/utomcat/tomcat/pre/webLoadBalance/web1 -Djava.io.tmpdir=/home/utomcat/tomcat/pre/webLoadBalance/web1/temp org.apache.catalina.startup.Bootstrap start
utomcat 21273 70.5 7.2 2823004 282968 pts/10 Sl 15:07 0:30 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/pre/backend/schedule/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms250M -Xmx250M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/pre/backend/schedule/bin/bootstrap.jar:/home/utomcat/tomcat/pre/backend/schedule/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/pre/backend/schedule -Dcatalina.home=/home/utomcat/tomcat/pre/backend/schedule -Djava.io.tmpdir=/home/utomcat/tomcat/pre/backend/schedule/temp org.apache.catalina.startup.Bootstrap start

# -v 是不显示匹配上的内容
[utomcat@hjweb01 ~]$ ps aux|head -1; ps aux | grep java | grep utomcat | grep -v pre | sort -k4nr | head -10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
utomcat 24909 0.1 15.6 3635036 608380 ? Sl Jul25 4:00 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/webLoadBalance/web2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/webLoadBalance/web2/bin/bootstrap.jar:/home/utomcat/tomcat/webLoadBalance/web2/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/webLoadBalance/web2 -Dcatalina.home=/home/utomcat/tomcat/webLoadBalance/web2 -Djava.io.tmpdir=/home/utomcat/tomcat/webLoadBalance/web2/temp org.apache.catalina.startup.Bootstrap start
utomcat 24722 0.0 13.6 3571100 530576 ? Sl Jul25 2:36 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/webLoadBalance/web1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/webLoadBalance/web1/bin/bootstrap.jar:/home/utomcat/tomcat/webLoadBalance/web1/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/webLoadBalance/web1 -Dcatalina.home=/home/utomcat/tomcat/webLoadBalance/web1 -Djava.io.tmpdir=/home/utomcat/tomcat/webLoadBalance/web1/temp org.apache.catalina.startup.Bootstrap start
utomcat 15263 0.1 6.7 3568036 263564 ? Sl Jul19 15:52 /usr/jdk1.8.0_181/bin/java -Djava.util.logging.config.file=/home/utomcat/tomcat/backend/schedule/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/utomcat/tomcat/backend/schedule/bin/bootstrap.jar:/home/utomcat/tomcat/backend/schedule/bin/tomcat-juli.jar -Dcatalina.base=/home/utomcat/tomcat/backend/schedule -Dcatalina.home=/home/utomcat/tomcat/backend/schedule -Djava.io.tmpdir=/home/utomcat/tomcat/backend/schedule/temp org.apache.catalina.startup.Bootstrap start
utomcat 31221 0.0 0.0 112708 972 pts/0 S+ 14:22 0:00 grep --color=auto java

查看更多参数

1
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep java | sort -nrk5

rsz 为实际内存占用,示例如下

1
2
3
4
5
6
7
8
9
[root@hjweb01 script]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep java | sort -nrk5
13545 java /usr/jdk1.8.0_181/bin/java 2.1 562456 3569484 13:31 utomcat 1001
13777 java /usr/jdk1.8.0_181/bin/java 2.0 543828 3565988 13:34 utomcat 1001
32454 java /usr/jdk1.8.0_181/bin/java 0.3 535532 3563932 10:21 utomcat 1001
22929 java /usr/jdk1.8.0_181/bin/java 0.1 524296 3593488 Jul24 utomcat 1001
13981 java /usr/jdk1.8.0_181/bin/java 2.1 519696 3563932 13:36 utomcat 1001
15263 java /usr/jdk1.8.0_181/bin/java 0.1 259860 3568036 Jul19 utomcat 1001
8454 java /usr/local/cloudmonitor/jre 0.4 72252 2522436 Jul18 root 0
16264 grep grep --color=auto java 0.0 972 112708 14:06 root 0

只看需要了解的参数,可调整参数列表

1
ps -e -o 'pid,comm,rsz,rss,user' | grep java | sort -nrk5

示例

1
2
3
4
5
6
7
8
[root@hjweb01 script]# ps -e -o 'pid,comm,rsz,rss,user' | grep java | sort -nrk5
8454 java 72252 root
32454 java 535596 utomcat
22929 java 524296 utomcat
15263 java 259860 utomcat
13981 java 519680 utomcat
13777 java 544028 utomcat
13545 java 562440 utomcat

内存的整体使用情况

1
2
3
4
[root@hjweb01 script]# free -m
total used free shared buff/cache available
Mem: 3790 2618 446 0 726 931
Swap: 0 0 0

top 命令查看内存使用情况

输入 top 之后,再按 m 键

1
2
3
4
5
6
7
8
9
10
11
12
13
top - 16:39:15 up 7 days, 22:33, 12 users,  load average: 0.02, 0.05, 0.05
Tasks: 119 total, 1 running, 118 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.5 us, 0.3 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 75.6/3881692 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ]
KiB Swap: 0.0/0 [ ]

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8454 root 20 0 2522436 72500 2724 S 1.3 1.9 49:36.58 java
14569 unginx 20 0 341748 17380 3332 S 0.7 0.4 0:13.04 php-fpm
574 unginx 20 0 342432 15616 3400 S 0.3 0.4 0:16.23 php-fpm
12413 root 20 0 150832 3112 1724 S 0.3 0.1 0:00.28 sshd
28174 root 20 0 157748 2196 1540 R 0.3 0.1 0:00.01 top
...

基于 tomcat 的调优

参考tomcat 8 9 性能 优化 调优 centos 7 linux
不要单纯为了调优而去调优,应该有针对性的去发现不足,解决问题,以提高性能。
所以,调优的前提是做好各种监控分析,包括服务器基础资源使用、各个应用运行状况、代码质量、数据库状况、等等,根据业务的并发,服务器资源,以及存在的问题,有针对性的去优化。

性能的提升,主要从以下几个方面入手

  1. 架构调优
    • 负载均衡,高可用,nginx + tomcat 动静分离,容器化 等, 不具体阐述
  2. 代码调优
    • 代码编写规范。
    • pmd 、findbug、sonar 等工具,检测问题,并优化。 不具体阐述。

tomcat 连接数,线程数,缓存,修改server.xml

打开被注释的默认连接池配置
默认配置:

1
2
3
4
<!--  
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->

修改实例:

1
2
3
4
5
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"  
maxThreads="150"
minSpareThreads="100"
prestartminSpareThreads="true"
maxQueueSize="100"/>

参数讲解:

1
2
3
4
5
6
name: 线程名称
namePrefix: 线程前缀
maxThreads : 最大并发连接数,不配置时默认200,一般建议设置500~ 800 ,要根据自己的硬件设施条件和实际业务需求而定。
minSpareThreads:Tomcat启动初始化的线程数,默认值25
prestartminSpareThreads:在tomcat初始化的时候就初始化minSpareThreads的值, 不设置trueminSpareThreads 的值就没啥效果了 。
maxQueueSize: 最大的等待队列数,超过则拒绝请求

修改连接配置

1
2
3
<Connector port="8080" protocol="HTTP/1.1"  
connectionTimeout="20000"
redirectPort="8443" />

改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
connectionTimeout="20000"  
redirectPort="8443"
executor="tomcatThreadPool"
enableLookups="false"
maxIdleTime="60000"
acceptCount="100"
maxPostSize="10485760"
acceptorThreadCount="2"
disableUploadTimeout="true"
URIEncoding="utf-8"
keepAliveTimeout ="6000"
maxKeppAliveRequests="500"
/>

参数讲解:

1
2
3
4
5
6
7
8
9
10
11
port:连接端口。  
protocol:连接器使用的传输方式。
executor: 连接器使用的线程池名称
enableLookups:禁用DNS 查询
maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 。
maxPostSize:限制 以FORM URL 参数方式的POST请求的内容大小,单位字节,默认是 2097152(2兆),10485760 为 10M。如果要禁用限制,则可以设置为 -1。
acceptorThreadCount: 用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2。
disableUploadTimeOut:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false
keepAliveTimeout - 表示在下次请求过来之前,tomcat保持该连接多久。这就是说假如客户端不断有请求过来,且未超过过期时间,则该连接将一直保持。
maxKeepAliveRequests -表示该连接最大支持的请求数。超过该请求数的连接也将被关闭(此时就会返回一个Connection: close头给客户端)。 (maxKeepAliveRequests="1"代表禁用长连接)(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间)

压缩会增加Tomcat负担,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,压缩交由Nginx/Apache 去做。
Tomcat 的压缩是在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的 浏览过程 HTML、CSS、Javascript和Text,它可以节省40% 左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高。

管理AJP端口
AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。 默认是开启的。如果不使用apache,注释该连接器。

1
2
3
4
5
6
7
8
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
```

## tomcat JVM 调优
这一点需要去了解较多的基础知识,比如:了解堆栈内存,了解jvm 垃圾收集器,了解jvm 性能监控常用工具,能够读懂gc日志等。
修改 catalina.sh (4G 内存机器参考配置)

JAVA_OPTS=”-Xms2G -Xmx2G -Xmn512m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/appl/gc.log -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly”

1
## 参数解释

-Xms2G 初始分配的堆内存
-Xmx2G 最大允许分配的堆内存,这两个配成一样。
-Xmn512m 年轻代大小

-XX:MetaspaceSize=512M 初始元空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize=512M

-XX:+UseConcMarkSweepGC 并发标记清除(CMS)收集器

-XX:+CMSClassUnloadingEnabled

-XX:+HeapDumpOnOutOfMemoryError 表示当JVM发生OOM时,自动生成DUMP文件。
-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java__heapDump.hprof。

-verbose:gc 输出GC日志 , -XX:+PrintGC 与 -verbose:gc 是一样的,可以认为-verbose:gc 是 -XX:+PrintGC的别名.

-XX:+PrintGCDetails 打印GC详细信息
-XX:+PrintGCTimeStamps 打印gc时间戳
-XX:+PrintGCDateStamps
-Xloggc:/appl/gc.log 定义gc日志目录
-XX:CMSInitiatingOccupancyFraction=75 是指设定CMS在对内存占用率达到75%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);

-XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的75%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整

1
2
3
4
5
6
7
8
9
10

# apr 模式
(Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从操作系统级别解决异步IO问题,从而大大地提高Tomcat对静态文件的处理性能。
要tomcat支持apr,必须要安装apr和native,这样tomcat可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。
[tomcat apr 模式](https://tomcat.apache.org/native-doc/)

todo:具体设置还需要百度和实际操作和测试。

## JVM 调优另外一个版本
{tomcat_home}/bin/catalina.sh

OS specific support. $var must be set to either true or false.

1
在该注释后添加如下代码:

export JAVA_OPTS=’
-server
-Xms350M
-Xmx350M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true’;

1
2

参数解释

-Xmx:java heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间