1. 程式人生 > >tomcat服務中記憶體相關的優化

tomcat服務中記憶體相關的優化

啟動引數

通過在tomcat的啟動指令碼catalina.sh中設定JAVA_OPTS或CATALINA_OPTS引數以實現tomcat記憶體的優化。常用引數見下表:

引數 說明
-server 設定啟用jdk的server版。應用啟動可能慢點,但能很大程度提高執行效能
-Xms 設定JVM初始化時的記憶體大小
-Xmx 設定JVM可使用的最大記憶體大小
-Xmn 設定JVM最小記憶體大小,一般可以不設
-Xss 設定每個執行緒stack的大小,stack的大小會影響執行緒的數量
-XX:PermSize 設定記憶體永久保留區域的大小
-XX:MaxPermSize 設定最大記憶體永久保留區域的大小
-XX:InitialCodeCacheSize 設定初始程式碼快取的大小
-XX:ReservedCodeCacheSize 設定程式碼快取的大小,如果程式碼快取被佔滿,JVM將切換到interpreted-only模式:JIT編譯器被停用,位元組碼將不再會被編譯成機器碼
-XX:+UseCodeCacheFlushing 當代碼快取被填滿時,讓JVM放棄一些編譯程式碼
-XX:OnOutOfMemoryError 指定當記憶體溢位時執行一些指令,如發通知郵件或執行清理操作等,例:-XX:OnOutOfMemoryError=”sh ~/clean.sh”
-XX:+HeapDumpOnOutOfMemoryError 讓JVM在發生記憶體溢位時自動的生成堆記憶體快照,預設儲存在JVM的啟動目錄下名為java_pid.hprof的檔案裡
-XX:HeapDumpPath 指定當記憶體溢位時將堆記憶體快照寫到的檔案路徑;堆記憶體快照檔案可能很大,最好指定到一個有足夠空間的地方

說明

1 堆記憶體
通常推薦將-Xms和-Xmx設定為相同大小。初始化的時候是按照-Xms的值來申請的記憶體大小,如果虛擬機器啟動時的記憶體較小,而應用程式在大負載情況下需要更多記憶體時,虛擬機器就必須不斷的增加記憶體來滿足使用。因此,把-Xms和-Xmx設定為一樣大小可以避免虛擬機器重複的調整堆大小。如果堆大小設定太小,會報記憶體溢位的錯誤。另外,堆大小最大不要超多可用記憶體的80%。

2 永久保留區域
記憶體永久保留區域(Permanent Generation Space)主要是被JVM用來存放Class和Meta資訊的。Class在被Loader時就會被放到PermGen Space中,它和存放類例項的Heap區域不同,垃圾收集(GC)不會在主程式執行期間對PermGen Space進行清理。

3 執行緒棧
執行緒stack大小通過-Xss來設定。stack太小會導致stack溢位,但stack太大,能夠建立的執行緒數量將會受到限制,也可能導致記憶體溢位。其實,堆大小的設定也會影響執行緒數量的,因為可支援最大執行緒數=(可用記憶體-堆大小-Perm大小-)/Xss大小。

4 程式碼快取
程式碼快取(CodeCache)主要用於存放JIT所編譯的程式碼。程式碼快取區的大小在client模式下預設最大值為32m,在server模式下預設最大值為48m。這個值是可以設定,例如將其設定為80m可以使用:-XX:ReservedCodeCacheSize=80m

另外,需要注意的是,tomcat實際使用記憶體往往會超出JVM引數設定的值,不要驚慌。首先,JVM也是一個應用程式,自身執行也是需要消耗記憶體的。

後續想到了再補充。。。