1、修改啟動時內存參數、並指定JVM時區 :
在Tomcat上運行j2ee項目代碼時,經常會出現內存溢出的情況,解決辦法是在系統參數中增加系統參數:
window下, 在catalina.bat最前面:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m;-Duser.timezone=GMT+08;
一定加在catalina.bat最前面。
linux下,在catalina.sh最前面增加:
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"
注意:前后二者區別,有無set,有無雙引號。
2、線程池配置(Tomcat6下)使用線程池,用較少的線程處理較多的訪問,可以提高tomcat處理請求的能力。使用方式:
首先。打開/conf/server.xml,增加
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />
最大線程500(一般服務器足以),最小空閑線程數20,線程最大空閑時間60秒。
然后,修改<Connector ...>節點,增加executor屬性,如:
<Connectorexecutor="tomcatThreadPool"
port="80"
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個線程池。
3、調整連接相關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線程。
4、負載均衡、集群的配置
Tomcat6支持分布式部署,可以實現集群功能,提高響應能力。
5、利用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)
6、Tomcat增加一個應用
在server.xml的Host標簽中增加行
<Context displayName="OA" docBase="/app/web-apps/GACWP" path="" />
path代表上下文名稱,空表示是根路徑。
==================Java內存溢出詳解=================================================================
一、常見的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的。
通常遞歸也不要遞歸的層次過多,很容易溢出。
解決方法:修改程序。
二、解決方法
在生產環境中tomcat內存設置不好很容易出現jvm內存溢出
1、 linux下的tomcat:
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
2、 如果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服務,設置生效
3、如果tomcat 6注冊成了windows服務,或者windows2003下用tomcat的安裝版,
在/bin/tomcat6w.exe里修改就可以了 。
4、 如果要在myeclipse中啟動tomcat,上述的修改就不起作用了,可如下設置:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的
Optional Java VM arguments中添加:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m
三、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的3、4分之一
-XX:+UseParNewGC :縮短minor收集的時間
-XX:+UseConcMarkSweepGC :縮短major收集的時間 此選項在Heap Size比較大而且Major收集時間較長的情況下使用更合適。
-XX:userParNewGC 可用來設置並行收集【多CPU】
-XX:ParallelGCThreads 可用來增加並行度【多CPU】
-XX:UseParallelGC 設置后可以使用並行清除收集器【多CPU】