Tomcat優化相關問題

1. 你怎樣給 tomcat 去調優?

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

2. 如何加大 tomcat 連接數

在 tomcat 配置文件 server.xml 中的<Connector />配置中,和連接數相關的參數有:
minProcessors:最小空閑連接線程數,用于提高系統處理性能,默認值為 10
maxProcessors:最大連接線程數,即:并發處理的最大請求數,默認值為 75
acceptCount:允許的最大連接數,應大于等于 maxProcessors,默認值為 100
enableLookups:是否反查域名,取值為:true 或 false。為了提高處理能力,應設置為 false
connectionTimeout:網絡連接超時,單位:毫秒。設置為 0 表示永不超時,這樣設置有隱患的。通常可設置為 30000 毫秒。其中和最大連接數相關的參數為 maxProcessors 和 acceptCount。如果要加大并發連接數,應同時加大這兩個參數。web server 允許的最大連接數還受制于操作系統的內核參數設置,通常 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 參數設置成 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 的內存。

首先檢查程序有沒有限入死循環這個問題主要還是由這個問題 java.lang.OutOfMemoryError: Java heap space 引起的。第一次出現這樣的問題以后,引發了其他的問題。在網上一查可能是 JAVA 的堆棧設置太小的原因。
根據網上的答案大致有這兩種解決方法:
1、設置環境變量
解決方法:手動設置 Heap size修改 TOMCAT_HOME/bin/catalina.shset JAVA_OPTS= -Xms32m -Xmx512m可以根據自己機器的內存進行更改。
2、java -Xms32m -Xmx800m className
就是在執行 JAVA 類文件時加上這個參數,其中 className 是需要執行的確類名。(包括包名)
這個解決問題了。而且執行的速度比沒有設置的時候快很多。如果在測試的時候可能會用 Eclispe 這時候就需要在 Eclipse ->run -arguments 中的 VM arguments 中輸入-Xms32m -Xmx800m 這個參數就可以了。后來在 Eclilpse 中修改了啟動參數,在 VM arguments 加入了-Xms32m -Xmx800m,問題解決。
一、java.lang.OutOfMemoryError: PermGen space
PermGen space 的全稱是 Permanent Generation space,是指內存的永久保存區域,這塊內存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 時就會被放到 PermGen space 中,它和存放類實例(Instance)的 Heap 區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space 進行清理,所以如果你的應用中有很多 CLASS 的話,就很可能出現 PermGen space 錯 誤,
這種錯誤常見在 web 服務器對 JSP 進行 pre compile 的時候。如果你的 WEB APP 下都用了大量的第三方 jar, 其大小超過了 jvm 默認的大小(4M)那么就會產生此錯誤信息了。
解決方法: 手動設置 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 目錄下,這樣可以達到減少 jar 文檔重復占用內存的目的。 二、java.lang.OutOfMemoryError: Java heap space Heap size 設置 JVM 堆的設置是指 java 程序運行過程中 JVM 可以調配使用的內存空間的設置.JVM 在啟動的時候會自動設置 Heap size 的值,其初始空間(即-Xms)是物理內存的 1/64,最大空間(-Xmx)是物理內存的 1/4。可以利用 JVM 提供的-Xmn-Xms -Xmx 等選項可進行設置。Heap size 的大小是 Young Generation 和 Tenured Generaion 之和。 提示:在 JVM 中如果 98%的時間是用于 GC 且可用的 Heap size 不足 2%的時候將拋出此異常信息。 提示:Heap Size 最大不要超過可用物理內存的 80%,一般的要將-Xms 和-Xmx 選項設置為相同,而-Xmn 為 1/4 的-Xmx 值。 解決方法:手動設置 Heap size修改 TOMCAT_HOME/bin/catalina.sh在“echo "Using CATALINA_BASE:CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
三、實例,以下給出 1G 內存環境下 java jvm 的參數設置參考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -
XX:MaxPermSize=128m -Djava.awt.headless=true "很大的 web 工程,用 tomcat 默認分配的內存空間無法啟動,如果不是在 myeclipse 中啟動 tomcat 可以對 tomcat 這樣設置:
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 中啟動,上述的修改就不起作用了,可如下設置:
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/>節點中添加:
<Context path="/hello"
docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot" debug="0"
privileged="true">
</Context>
至于 Context 節點屬性,可詳細見相關文檔。
第二種方法:
將 web 項目文件件拷貝到 webapps 目錄中。
第三種方法:
很靈活,在 conf 目錄中,新建 Catalina(注意大小寫)\localhost 目錄,在該目錄中新建一
個 xml 文件,名字可以隨意取,只要和當前文件中的文件名不重復就行了,該 xml 文件的內容
為:
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot"
debug="0" privileged="true">
</Context>
第 3 個方法有個優點,可以定義別名。服務器端運行的項目名稱為 path,外部訪問的 URL 則
使用 XML 的文件名。這個方法很方便的隱藏了項目的名稱,對一些項目名稱被固定不能更
換,但外部訪問時又想換個路徑,非常有效。
第 2、3 還有優點,可以定義一些個性配置,如數據源的配置等。
第四種辦法,:
可以用 tomcat 在線后臺管理器,一般 tomcat 都打開了,直接上傳 war 就可以

6.Tomcat 的優化經驗。

Tomcat 作為 Web 服務器,它的處理性能直接關系到用戶體驗,下面是幾種常見的
優化措施:
? 去掉對 web.xml 的監視,把 jsp 提前編輯成 Servlet。有富余物理內存的情況,加大 tomcat 使用的 jvm 的內存。
? 服務器資源
服務器所能提供 CPU、內存、硬盤的性能對處理能力有決定性影響。
o 對于高并發情況下會有大量的運算,那么 CPU 的速度會直接影響到處理速度。
o 內存在大量數據處理的情況下,將會有較大的內存容量需求,可以用 -Xmx -Xms -XX:MaxPermSize 等參數對內存不同功能塊進行劃分。我們之前就遇到過內存分配不足,導致虛擬機一直處于 full GC,從而導致處理能力嚴重下降。
o 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成為性能瓶頸。最好的辦法還是利用下面提到的緩存。
? 利用緩存和壓縮
對于靜態頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這里我們采用了 Nginx 作為緩存服務器,將圖片、css、js 文件都進行了緩存,有效的減少了后端 tomcat 的訪問。 另外,為了能加快網絡傳輸速度,開啟gzip 壓縮也是必不可少的。但考慮到 tomcat 已經需要處理很多東西了,所以把這個壓縮的工作就交給前端的 Nginx 來完成。 除了文本可以用gzip 壓縮,其實很多圖片也可以用圖像處理工具預先進行壓縮,找到一個平衡點可以讓畫質損失很小而文件可以減小很多。曾經我就見過一個圖片從 300多 kb 壓縮到幾十 kb,自己幾乎看不出來區別。
? 采用集群
單個服務器性能總是有限的,最好的辦法自然是實現橫向擴展,那么組建tomcat 集群是有效提升性能的手段。我們還是采用了 Nginx 來作為請求分流的服務器,后端多個 tomcat 共享 session 來協同工作。可以參考之前寫的《利用 nginx+tomcat+memcached 組建 web 服務器負載均衡》。
? 優化 tomcat 參數
這里以 tomcat7 的參數配置為例,需要修改 conf/server.xml 文件,主要是優化連接配置,關閉客戶端 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" />

結尾

以上就是我的經歷分享,和資料整理,全部都已打包好,均是免費分享的,等待愛學習的你,需要這些資料的朋友可以點擊這里免費領取!!!暗號:簡書

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容