tomcat8 JVM 優化


tomcat8 JVM 優化


tomcat8 JVM 優化

在Linux環境下設置Tomcat JVM,在/opt/tomcat/bin/catalina.sh文件中找到"# ----- Execute The Requested Command"位置,設置JVM如下:

# ----- Execute The Requested Command -----------------------------------------

JAVA_OPTS="$JAVA_OPTS -server -Xms3072m -Xmx3072m -XX:PermSize=1024M -XX:MaxPermSize=1024M"

參數說明:

-Xms:設置JVM最小內存。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。

-Xmx:設置JVM最大可用內存。

-XX:NewSize:設置年輕代大小

-XX:PermSize:設置永久代大小

-XX:MaxPermSize:設置最大永久代大小

JVM內存模型

1.1、Java棧

Java棧是與每一個線程關聯的,JVM在創建每一個線程的時候,會分配一定的棧空間給線程。它主要用來存儲線程執行過程中的局部變量,方法的返回值,以及方法調用上下文。棧空間隨著線程的終止而釋放。

StackOverflowError:如果在線程執行的過程中,棧空間不夠用,那麼JVM就會拋出此異常,這種情況一般是死遞歸造成的。

1.2、堆

Java中堆是由所有的線程共享的一塊內存區域,堆用來保存各種JAVA對象,比如數組,線程對象等。

1.3、Java 的內存模型

a、Young,年輕代(易被 GC)

Young 區被劃分為三部分,Eden 區和兩個大小嚴格相同的 Survivor 區,其中 Survivor 區間中,某一時刻只有其中一個是被使用的,另外一個留做垃圾收集時複製對象用,在 Young 區間變滿的時候,minor GC 就會將存活的對象移到空閒的Survivor 區間中,根據 JVM 的策略,在經過幾次垃圾收集後,仍然存活於 Survivor 的對象將被移動到 Tenured 區間。

b、Tenured,終身代

Tenured 區主要保存生命週期長的對象,一般是一些老的對象,當一些對象在 Young 複製轉移一定的次數以後,對象就會被轉移到 Tenured 區,一般如果系統中用了 application 級別的緩存,緩存中的對象往往會被轉移到這一區間。

c、Perm,永久代

主要保存 class,method,filed 對象,這部門的空間一般不會溢出,除非一次性加載了很多的類,不過在涉及到熱部署的應用服務器的時候,有時候會遇到 java.lang.OutOfMemoryError : PermGen space 的錯誤,造成這個錯誤的很大原因就有可能是每次都重新部署,但是重新部署後,類的 class 沒有被卸載掉,這樣就造成了大量的 class 對象保存在了 perm 中,這種情況下,一般重新啟動應用服務器可以解決問題。

如果服務器只運行一個 Tomcat:

機子內存如果是 8G,一般 PermSize 配置是主要保證系統能穩定起來就行:

JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms6144m -Xmx6144m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

機子內存如果是 16G,一般 PermSize 配置是主要保證系統能穩定起來就行:

JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms13312m -Xmx13312m -XX:NewSize=3072m -XX:MaxNewSize=4096m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

機子內存如果是 32G,一般 PermSize 配置是主要保證系統能穩定起來就行:

JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms29696m -Xmx29696m -XX:NewSize=6144m -XX:MaxNewSize=9216m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

如果是開發機:

-Xms550m -Xmx1250m -XX:PermSize=550m -XX:MaxPermSize=1250m

參數說明:

-Dfile.encoding:默認文件編碼

-server:表示這是應用於服務器的配置,JVM 內部會有特殊處理的

-Xmx1024m:設置JVM最大可用內存為1024MB

-Xms1024m:設置JVM最小內存為1024m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。

-XX:NewSize:設置年輕代大小

-XX:MaxNewSize:設置最大的年輕代大小

-XX:PermSize:設置永久代大小

-XX:MaxPermSize:設置最大永久代大小

-XX:NewRatio=4:設置年輕代(包括 Eden 和兩個 Survivor 區)與終身代的比值(除去永久代)。設置為 4,則年輕代與終身代所佔比值為 1:4,年輕代佔整個堆棧的 1/5

-XX:MaxTenuringThreshold=10:設置垃圾最大年齡,默認為:15。如果設置為 0 的話,則年輕代對象不經過 Survivor 區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在 Survivor 區進行多次複製,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。

-XX:+DisableExplicitGC:這個將會忽略手動調用 GC 的代碼使得 System.gc() 的調用就會變成一個空調用,完全不會觸發任何 GC


分享到:


相關文章: