Tomcat性能優化

一、修改啓動時內存參數、並指定JVM時區 :

 在Tomcat上運行j2ee項目代碼時,常常會出現內存溢出的狀況,解決辦法是在系統參數中增長系統參數: java

 window下, 在catalina.bat最前面:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m;-Duser.timezone=GMT+08;
必定加在catalina.bat最前面。linux

 linux下,在catalina.sh最前面增長:web

JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"apache

 注意:先後兩者區別,有無set,有無雙引號。windows

 二、線程池配置(Tomcat6下)使用線程池,用較少的線程處理較多的訪問,能夠提升tomcat處理請求的能力。使用方式:

首先。打開/conf/server.xml,增長tomcat

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />服務器

最大線程500(通常服務器足以),最小空閒線程數20,線程最大空閒時間60秒。網絡

而後,修改<Connector ...>節點,增長executor屬性,如:併發

<Connectorexecutor="tomcatThreadPool"
               port="80"app

protocol="HTTP/1.1"

maxThreads="600"

minSpareThreads="100"

maxSpareThreads="300"
               connectionTimeout="60000"
               keepAliveTimeout="15000"
               maxKeepAliveRequests="1"
               redirectPort="443"
               ....../>

maxThreads:Tomcat可建立的最大的線程數,每個線程處理一個請求;

minSpareThreads:最小備用線程數,tomcat啓動時的初始化的線程數;

maxSpareThreads:最大備用線程數,一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程;

acceptCount:指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,就是被排隊的請求數,超過這個數的請求將拒絕鏈接。

connnectionTimeout:網絡鏈接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒。
enableLookups:是否容許DNS查詢

注意:能夠多個connector公用1個線程池。

 三、調整鏈接相關Connector的參數:

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1" 
               connectionTimeout="60000"
               keepAliveTimeout="15000"
               maxKeepAliveRequests="1"
               redirectPort="443"
               maxHttpHeaderSize="8192" URIEncoding="UTF-8" enableLookups="false" acceptCount="100" disableUploadTimeout="true"/>

 

參數說明:

connectionTimeout -網絡鏈接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒。 keepAliveTimeout -長鏈接最大保持時間(毫秒)。此處爲15秒。 maxKeepAliveRequests -最大長鏈接個數(1表示禁用,-1表示不限制個數,默認100個。通常設置在100~200之間)the maximum number of HTTP requests that can be held in the pipeline until the connection is closed by the server. Setting this attribute to 1 disables HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 allows an unlimited number of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100. maxHttpHeaderSize - http請求頭信息的最大程度,超過此長度的部分不予處理。通常8K。 URIEncoding -指定Tomcat容器的URL編碼格式。 acceptCount -指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理,默認爲10個。defines the maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full are refused. The default value is 10. disableUploadTimeout -上傳時是否使用超時機制 enableLookups -是否反查域名,取值爲:true或false。爲了提升處理能力,應設置爲false bufferSize - defines the size (in bytes) of the buffer to be provided for input streams created by this connector. By default, buffers of 2048 bytes are provided. maxSpareThreads -作多空閒鏈接數,一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程 the maximum number of unused request processing threads that are allowed to exist until the thread pool starts stopping the unnecessary threads. The default value is 50. maxThreads -最多同時處理的鏈接數,Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。。the maximum number of request processing threads to be created by this Connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200. minSpareThreads -最小空閒線程數,Tomcat初始化時建立的線程數the number of request processing threads that are created when this Connector is first started. The connector will also make sure it has the specified number of idle processing threads available. This attribute should be set to a value smaller than that set for maxThreads. The default value is 4. minProcessors -最小空閒鏈接線程數,用於提升系統處理性能,默認值爲10。(用於Tomcat4中) maxProcessors -最大鏈接線程數,即:併發處理的最大請求數,默認值爲75。(用於Tomcat4中)

備註:

Tomcat4中能夠經過修改minProcessors和maxProcessors的值來控制線程數。

在Tomcat5+主要對如下參數調整
maxThreads
 Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。
 acceptCount 
 指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。
 connnectionTimeout 
 網絡鏈接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒。
 minSpareThreads 
 Tomcat初始化時建立的線程數。
 maxSpareThreads 
 一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程。 

 四、負載均衡、集羣的配置

Tomcat6支持分佈式部署,能夠實現集羣功能,提升響應能力。

五、利用JMX監控Tomcat運行狀況,須要手工調整啓動參數,以下:

打開cataline.bat,增長一行

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

 

linux下修改cataline.sh:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=%CATALINA_BASE\conf\logging.properties"

注意JDK\jre\lib\management\management.properties文件必須存在。

從新啓動tomcat節點,而後用jconsole鏈接(此處端口wei10090)

六、Tomcat增長一個應用

在server.xml的Host標籤中增長行

<Context displayName="OA" docBase="/app/web-apps/GACWP" path="" />

path表明上下文名稱,空表示是根路徑。

==================Java內存溢出詳解=================================================================

1、常見的Java內存溢出有如下三種:

1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
JVM在啓動的時候會自動設置JVM Heap的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)不可超過物理內存。

能夠利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap的大小是Young Generation 和Tenured Generaion之和。

在JVM中若是98%的時間是用於GC,且可用的Heap size 不足2%的時候將拋出此異常信息。

解決方法:手動設置JVM Heap(堆)的大小。  

2. java.lang.OutOfMemoryError: PermGen space  ---- PermGen space溢出。 
PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域。

爲何會內存溢出,這是因爲這塊內存主要是被JVM存放Class和Meta信息的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不一樣,sun的GC不會在主程序運行期對PermGen space進行清理,因此若是你的APP會載入不少CLASS的話,就極可能出現PermGen space溢出。

解決方法: 手動設置MaxPermSize大小

3. java.lang.StackOverflowError   ---- 棧溢出
棧溢出了,JVM依然是採用棧式的虛擬機,這個和C和Pascal都是同樣的。函數的調用過程都體如今堆棧和退棧上了。
調用構造函數的 「層」太多了,以至於把棧區溢出了。
一般來說,通常棧區遠遠小於堆區的,由於函數調用過程每每不會多於上千層,而即使每一個函數調用須要 1K的空間(這個大約至關於在一個C函數內聲明瞭256個int類型的變量),那麼棧區也不過是須要1MB的空間。一般棧的大小是1-2MB的。
一般遞歸也不要遞歸的層次過多,很容易溢出。

解決方法:修改程序。

2、解決方法

在生產環境中tomcat內存設置很差很容易出現jvm內存溢出

一、 linux下的tomcat:  

修改TOMCAT_HOME/bin/catalina.sh 
在「echo "Using CATALINA_BASE: $CATALINA_BASE"」上面加入如下行: 
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" 

二、 若是tomcat 5註冊成了windows服務,以services方式啓動的,則須要修改註冊表中的相應鍵值。

修改註冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\Java,右側的Options
原值爲
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs
加入 -Xms256m -Xmx512m 
重起tomcat服務,設置生效

三、若是tomcat 6註冊成了windows服務,或者windows2003下用tomcat的安裝版,

在/bin/tomcat6w.exe裏修改就能夠了 。

四、 若是要在myeclipse中啓動tomcat,上述的修改就不起做用了,可以下設置:

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的

Optional Java VM arguments中添加:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m

3、jvm參數說明:

-server:必定要做爲第一個參數,在多個CPU時性能佳 
-Xms:java Heap初始大小。 默認是物理內存的1/64。
-Xmx:java heap最大值。建議均設爲物理內存的一半。不可超過物理內存。

-XX:PermSize:設定內存的永久保存區初始大小,缺省值爲64M。(我用visualvm.exe查看的)

-XX:MaxPermSize:設定內存的永久保存區最大 大小,缺省值爲64M。(我用visualvm.exe查看的) 

-XX:SurvivorRatio=2  :生還者池的大小,默認是2,若是垃圾回收變成了瓶頸,您能夠嘗試定製生成池設置 

-XX:NewSize: 新生成的池的初始大小。 缺省值爲2M。

-XX:MaxNewSize: 新生成的池的最大大小。   缺省值爲32M。

若是 JVM 的堆大小大於 1GB,則應該使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者將堆的總大小的50% 到60% 分配給新生成的池。調大新對象區,減小Full GC次數。

+XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。 
-Xss:每一個線程的Stack大小,「-Xss 15120」這使得JBoss每增長一個線程(thread)就會當即消耗15M內存,而最佳值應該是128K,默認值好像是512k. 
-verbose:gc 現實垃圾收集信息 
-Xloggc:gc.log 指定垃圾收集日誌文件 
-Xmn:young generation的heap大小,通常設置爲Xmx的三、4分之一 
-XX:+UseParNewGC :縮短minor收集的時間 
-XX:+UseConcMarkSweepGC :縮短major收集的時間 此選項在Heap Size比較大並且Major收集時間較長的狀況下使用更合適。

-XX:userParNewGC 可用來設置並行收集【多CPU】

-XX:ParallelGCThreads 可用來增長並行度【多CPU】-XX:UseParallelGC 設置後可使用並行清除收集器【多CPU】

相關文章
相關標籤/搜索