1. 你怎樣給 tomcat 去調優?
- JVM 參數調優:-Xms<size> 表示 JVM 初始化堆的大小,-Xmx<size>表示 JVM 堆的最大值。這兩個值的大小一般根據需要進行設置。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,并且導致應用服務崩潰。因此一般建議堆的最大值設置為可用內存的最大值的 80%。在 catalina.bat 中,設置 JAVA_OPTS='-Xms256m -Xmx512m',表示初始化內存為 256MB,可以使用的最大內存為 512MB。
- 禁用 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"/> - 調整線程數
通過應用程序的連接器(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 -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" />
結尾
以上就是我的經歷分享,和資料整理,全部都已打包好,均是免費分享的,等待愛學習的你,需要這些資料的朋友可以點擊這里免費領取!!!暗號:簡書