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也是一個應用程式,自身執行也是需要消耗記憶體的。
後續想到了再補充。。。