1. 程式人生 > 實用技巧 >Tomcat效能優化以及 jvm 引數設定

Tomcat效能優化以及 jvm 引數設定

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收集的時間