Tomcat優(yōu)化相關(guān)問題

1. 你怎樣給 tomcat 去調(diào)優(yōu)?

  1. JVM 參數(shù)調(diào)優(yōu):-Xms<size> 表示 JVM 初始化堆的大小,-Xmx<size>表示 JVM 堆的最大值。這兩個值的大小一般根據(jù)需要進(jìn)行設(shè)置。當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時虛擬機(jī)就會提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值的 80%。在 catalina.bat 中,設(shè)置 JAVA_OPTS='-Xms256m -Xmx512m',表示初始化內(nèi)存為 256MB,可以使用的最大內(nèi)存為 512MB。
  2. 禁用 DNS 查詢
    當(dāng) web 應(yīng)用程序向要記錄客戶端的信息時,它也會記錄客戶端的 IP 地址或者通過域名服務(wù)器查找機(jī)器名轉(zhuǎn)換為 IP 地址。DNS 查詢需要占用網(wǎng)絡(luò),并且包括可能從很多很遠(yuǎn)的服務(wù)器或者不起作用的服務(wù)器上去獲取對應(yīng)的 IP 的過程,這樣會消耗一定的時間。為了消除 DNS 查詢對性能的影響我們可以關(guān)閉 DNS 查詢,方式是修改 server.xml 文件中的 enableLookups 參數(shù)值:
    Tomcat4
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80"
    minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443"
    acceptCount="100" debug="0" connectionTimeout="20000"
    useURIValidationHack="false" disableUploadTimeout="true" />
    Tomcat5
    <Connector port="80" maxThreads="150" minSpareThreads="25"
    maxSpareThreads="75" enableLookups="false" redirectPort="8443"
    acceptCount="100" debug="0" connectionTimeout="20000"
    disableUploadTimeout="true"/>
  3. 調(diào)整線程數(shù)
    通過應(yīng)用程序的連接器(Connector)進(jìn)行性能控制的的參數(shù)是創(chuàng)建的處理請求的線程數(shù)。Tomcat 使用線程池加速響應(yīng)速度來處理請求。在 Java 中線程是程序運(yùn)行時的路徑,是在一個程序中與其它控制線程無關(guān)的、能夠獨(dú)立運(yùn)行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出 CPU 最大利用率的高效程序,使空閑時間保持最低,從而接受更多的請求。
    Tomcat4 中可以通過修改 minProcessors 和 maxProcessors 的值來控制線程數(shù)。這些值在安裝后就已經(jīng)設(shè)定為默認(rèn)值并且是足夠使用的,但是隨著站點(diǎn)的擴(kuò)容而改大這些值。
    minProcessors 服務(wù)器啟動時創(chuàng)建的處理請求的線程數(shù)應(yīng)該足夠處理一個小量的負(fù)載。也就是說,如果一天內(nèi)每秒僅發(fā)生 5 次單擊事件,并且每個請求任務(wù)處理需要 1 秒鐘,那么預(yù)先設(shè)置線程數(shù)為 5 就足夠了。但在你的站點(diǎn)訪問量較大時就需要設(shè)置更大的線程數(shù),指定為參數(shù)maxProcessors 的值。maxProcessors 的值也是有上限的,應(yīng)防止流量不可控制(或者惡意的服務(wù)攻擊),從而導(dǎo)致超出了虛擬機(jī)使用內(nèi)存的大小。如果要加大并發(fā)連接數(shù),應(yīng)同時加大這兩個參數(shù)。web server 允許的最大連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置,通常Windows 是 2000 個左右,Linux 是 1000 個左右。
    在 Tomcat5 對這些參數(shù)進(jìn)行了調(diào)整,請看下面屬性:
    maxThreads Tomcat 使用線程來處理接收的每個請求。這個值表示 Tomcat 可創(chuàng)建的最大的線程數(shù)。
    acceptCount 指定當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理。
    connnectionTimeout 網(wǎng)絡(luò)連接超時,單位:毫秒。設(shè)置為 0 表示永不超時,這樣設(shè)置有隱患的。通??稍O(shè)置為 30000 毫秒。
    minSpareThreads Tomcat 初始化時創(chuàng)建的線程數(shù)。
    maxSpareThreads 一旦創(chuàng)建的線程超過這個值,Tomcat 就會關(guān)閉不再需要的 socket 線程。最好的方式是多設(shè)置幾次并且進(jìn)行測試,觀察響應(yīng)時間和內(nèi)存使用情況。在不同的機(jī)器、操作系統(tǒng)或虛擬機(jī)組合的情況下可能會不同,而且并不是所有人的 web 站點(diǎn)的流量都是一樣的,因此沒有一刀切的方案來確定線程數(shù)的值。

2. 如何加大 tomcat 連接數(shù)

在 tomcat 配置文件 server.xml 中的<Connector />配置中,和連接數(shù)相關(guān)的參數(shù)有:
minProcessors:最小空閑連接線程數(shù),用于提高系統(tǒng)處理性能,默認(rèn)值為 10
maxProcessors:最大連接線程數(shù),即:并發(fā)處理的最大請求數(shù),默認(rèn)值為 75
acceptCount:允許的最大連接數(shù),應(yīng)大于等于 maxProcessors,默認(rèn)值為 100
enableLookups:是否反查域名,取值為:true 或 false。為了提高處理能力,應(yīng)設(shè)置為 false
connectionTimeout:網(wǎng)絡(luò)連接超時,單位:毫秒。設(shè)置為 0 表示永不超時,這樣設(shè)置有隱患的。通常可設(shè)置為 30000 毫秒。其中和最大連接數(shù)相關(guān)的參數(shù)為 maxProcessors 和 acceptCount。如果要加大并發(fā)連接數(shù),應(yīng)同時加大這兩個參數(shù)。web server 允許的最大連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置,通常 Windows 是 2000 個左右,Linux 是 1000 個左右。
tomcat5 中的配置示例:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
對于其他端口的偵聽配置,以此類推。

3. tomcat 中如何禁止列目錄下的文件

在{tomcat_home}/conf/web.xml 中,把 listings 參數(shù)設(shè)置成 false 即可,如下:
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>

4.怎樣加大 tomcat 的內(nèi)存。

首先檢查程序有沒有限入死循環(huán)這個問題主要還是由這個問題 java.lang.OutOfMemoryError: Java heap space 引起的。第一次出現(xiàn)這樣的問題以后,引發(fā)了其他的問題。在網(wǎng)上一查可能是 JAVA 的堆棧設(shè)置太小的原因。
根據(jù)網(wǎng)上的答案大致有這兩種解決方法:
1、設(shè)置環(huán)境變量
解決方法:手動設(shè)置 Heap size修改 TOMCAT_HOME/bin/catalina.shset JAVA_OPTS= -Xms32m -Xmx512m可以根據(jù)自己機(jī)器的內(nèi)存進(jìn)行更改。
2、java -Xms32m -Xmx800m className
就是在執(zhí)行 JAVA 類文件時加上這個參數(shù),其中 className 是需要執(zhí)行的確類名。(包括包名)
這個解決問題了。而且執(zhí)行的速度比沒有設(shè)置的時候快很多。如果在測試的時候可能會用 Eclispe 這時候就需要在 Eclipse ->run -arguments 中的 VM arguments 中輸入-Xms32m -Xmx800m 這個參數(shù)就可以了。后來在 Eclilpse 中修改了啟動參數(shù),在 VM arguments 加入了-Xms32m -Xmx800m,問題解決。
一、java.lang.OutOfMemoryError: PermGen space
PermGen space 的全稱是 Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 時就會被放到 PermGen space 中,它和存放類實例(Instance)的 Heap 區(qū)域不同,GC(Garbage Collection)不會在主程序運(yùn)行期對PermGen space 進(jìn)行清理,所以如果你的應(yīng)用中有很多 CLASS 的話,就很可能出現(xiàn) PermGen space 錯 誤,
這種錯誤常見在 web 服務(wù)器對 JSP 進(jìn)行 pre compile 的時候。如果你的 WEB APP 下都用了大量的第三方 jar, 其大小超過了 jvm 默認(rèn)的大小(4M)那么就會產(chǎn)生此錯誤信息了。
解決方法: 手動設(shè)置 MaxPermSize 大小
修改 TOMCAT_HOME/bin/catalina.sh在“echo "Using CATALINA_BASE: CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 建議:將相同的第三方 jar 文件移置到 tomcat/shared/lib 目錄下,這樣可以達(dá)到減少 jar 文檔重復(fù)占用內(nèi)存的目的。 二、java.lang.OutOfMemoryError: Java heap space Heap size 設(shè)置 JVM 堆的設(shè)置是指 java 程序運(yùn)行過程中 JVM 可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM 在啟動的時候會自動設(shè)置 Heap size 的值,其初始空間(即-Xms)是物理內(nèi)存的 1/64,最大空間(-Xmx)是物理內(nèi)存的 1/4??梢岳?JVM 提供的-Xmn-Xms -Xmx 等選項可進(jìn)行設(shè)置。Heap size 的大小是 Young Generation 和 Tenured Generaion 之和。 提示:在 JVM 中如果 98%的時間是用于 GC 且可用的 Heap size 不足 2%的時候?qū)伋龃水惓P畔ⅰ?提示:Heap Size 最大不要超過可用物理內(nèi)存的 80%,一般的要將-Xms 和-Xmx 選項設(shè)置為相同,而-Xmn 為 1/4 的-Xmx 值。 解決方法:手動設(shè)置 Heap size修改 TOMCAT_HOME/bin/catalina.sh在“echo "Using CATALINA_BASE:CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
三、實例,以下給出 1G 內(nèi)存環(huán)境下 java jvm 的參數(shù)設(shè)置參考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -
XX:MaxPermSize=128m -Djava.awt.headless=true "很大的 web 工程,用 tomcat 默認(rèn)分配的內(nèi)存空間無法啟動,如果不是在 myeclipse 中啟動 tomcat 可以對 tomcat 這樣設(shè)置:
TOMCAT_HOME/bin/catalina.bat 中添加這樣一句話:
set JAVA_OPTS=-server -Xms2048m -Xmx4096m -XX:PermSize=512M -
XX:MaxPermSize=1024M -Duser.timezone=GMT+08
或者
set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m
如果要在 myeclipse 中啟動,上述的修改就不起作用了,可如下設(shè)置:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的
Optional Java VM arguments 中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m
本人遇見的問題是:在 myeclipse 中啟動 Tomcat 時,提示"ava.lang.OutOfMemoryError:Java heap space",解決辦法就是:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的
Optional Java VM arguments 中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m

5.Tomcat 有幾種部署方式

tomcat 中四種部署項目的方法
第一種方法:
在 tomcat 中的 conf 目錄中,在 server.xml 中的,<host/>節(jié)點(diǎn)中添加:
<Context path="/hello"
docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot" debug="0"
privileged="true">
</Context>
至于 Context 節(jié)點(diǎn)屬性,可詳細(xì)見相關(guān)文檔。
第二種方法:
將 web 項目文件件拷貝到 webapps 目錄中。
第三種方法:
很靈活,在 conf 目錄中,新建 Catalina(注意大小寫)\localhost 目錄,在該目錄中新建一
個 xml 文件,名字可以隨意取,只要和當(dāng)前文件中的文件名不重復(fù)就行了,該 xml 文件的內(nèi)容
為:
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot"
debug="0" privileged="true">
</Context>
第 3 個方法有個優(yōu)點(diǎn),可以定義別名。服務(wù)器端運(yùn)行的項目名稱為 path,外部訪問的 URL 則
使用 XML 的文件名。這個方法很方便的隱藏了項目的名稱,對一些項目名稱被固定不能更
換,但外部訪問時又想換個路徑,非常有效。
第 2、3 還有優(yōu)點(diǎn),可以定義一些個性配置,如數(shù)據(jù)源的配置等。
第四種辦法,:
可以用 tomcat 在線后臺管理器,一般 tomcat 都打開了,直接上傳 war 就可以

6.Tomcat 的優(yōu)化經(jīng)驗。

Tomcat 作為 Web 服務(wù)器,它的處理性能直接關(guān)系到用戶體驗,下面是幾種常見的
優(yōu)化措施:
? 去掉對 web.xml 的監(jiān)視,把 jsp 提前編輯成 Servlet。有富余物理內(nèi)存的情況,加大 tomcat 使用的 jvm 的內(nèi)存。
? 服務(wù)器資源
服務(wù)器所能提供 CPU、內(nèi)存、硬盤的性能對處理能力有決定性影響。
o 對于高并發(fā)情況下會有大量的運(yùn)算,那么 CPU 的速度會直接影響到處理速度。
o 內(nèi)存在大量數(shù)據(jù)處理的情況下,將會有較大的內(nèi)存容量需求,可以用 -Xmx -Xms -XX:MaxPermSize 等參數(shù)對內(nèi)存不同功能塊進(jìn)行劃分。我們之前就遇到過內(nèi)存分配不足,導(dǎo)致虛擬機(jī)一直處于 full GC,從而導(dǎo)致處理能力嚴(yán)重下降。
o 硬盤主要問題就是讀寫性能,當(dāng)大量文件進(jìn)行讀寫時,磁盤極容易成為性能瓶頸。最好的辦法還是利用下面提到的緩存。
? 利用緩存和壓縮
對于靜態(tài)頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這里我們采用了 Nginx 作為緩存服務(wù)器,將圖片、css、js 文件都進(jìn)行了緩存,有效的減少了后端 tomcat 的訪問。 另外,為了能加快網(wǎng)絡(luò)傳輸速度,開啟gzip 壓縮也是必不可少的。但考慮到 tomcat 已經(jīng)需要處理很多東西了,所以把這個壓縮的工作就交給前端的 Nginx 來完成。 除了文本可以用gzip 壓縮,其實很多圖片也可以用圖像處理工具預(yù)先進(jìn)行壓縮,找到一個平衡點(diǎn)可以讓畫質(zhì)損失很小而文件可以減小很多。曾經(jīng)我就見過一個圖片從 300多 kb 壓縮到幾十 kb,自己幾乎看不出來區(qū)別。
? 采用集群
單個服務(wù)器性能總是有限的,最好的辦法自然是實現(xiàn)橫向擴(kuò)展,那么組建tomcat 集群是有效提升性能的手段。我們還是采用了 Nginx 來作為請求分流的服務(wù)器,后端多個 tomcat 共享 session 來協(xié)同工作??梢詤⒖贾皩懙摹独?nginx+tomcat+memcached 組建 web 服務(wù)器負(fù)載均衡》。
? 優(yōu)化 tomcat 參數(shù)
這里以 tomcat7 的參數(shù)配置為例,需要修改 conf/server.xml 文件,主要是優(yōu)化連接配置,關(guān)閉客戶端 dns 查詢。
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8" />

結(jié)尾

以上就是我的經(jīng)歷分享,和資料整理,全部都已打包好,均是免費(fèi)分享的,等待愛學(xué)習(xí)的你,需要這些資料的朋友可以點(diǎn)擊這里免費(fèi)領(lǐng)取!!!暗號:簡書

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容