話不多講,奉上代碼,分享經驗,交流提高!
64G物理內存,8核CPU生產環境tomcat-jvm配置如下:
JAVA_OPTS=-server -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=2G
-XX:+UseG1GC -Xms48G -Xmx48G -XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=8M -XX:InitiatingHeapOccupancyPercent=45
-XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow
-Doracle.jdbc.useNio=false -Dsun.zip.disableMemoryMapping=true
-Dorg.apache.el.parser.COERCE_TO_ZERO=true
-Djgroups.bind_addr=0.0.0.0
編號 | 配置參數 | 參數含義及備注說明 |
1 | -server | 啟用JVM的“服務器模式”優化,針對長時間運行的應用進行性能優化(如更高的吞吐量、更積極的即時編譯)。適用于生產環境中的服務端應用,一定要作為第一個參數。 |
2 | -XX:MaxMetaspaceSize=4G?? | ??設置Metaspace(元數據區,替代永久代)的最大大小為4GB,防止類元數據無限制增長導致內存溢出。??注??:Metaspace存放類定義、方法元數據等信息,默認無上限,需監控避免泄漏。 |
3 | -XX:ReservedCodeCacheSize=2G? ? | 設置JIT編譯后的本地代碼緩存區大小為2GB,避免大型應用因代碼緩存不足導致性能下降。注??:代碼緩存滿時,JIT可能停止編譯,影響性能。 |
4 | -XX:+UseG1GC?? | 啟用G1(Garbage-First)垃圾收集器,適合大堆內存(如48G)和低延遲場景。?特點??:分區域回收,優先處理垃圾最多的區域,減少停頓時間。 |
5 | -Xms48G -Xmx48G?? | ??設置JVM堆內存的初始值(Xms)和最大值(Xmx)均為48GB,避免堆動態擴容帶來的性能波動。生產建議??:通常建議兩者設為相等,避免堆大小調整導致GC頻繁。 |
6 | -XX:MaxGCPauseMillis=200?? | ??設定G1垃圾收集器的目標最大停頓時間為200毫秒,JVM會盡量調整GC策略以滿足該目標。權衡??:過低的設置可能導致更頻繁的GC,影響吞吐量。 |
7 | -XX:G1HeapRegionSize=8M?? | ??設置G1垃圾收集器的內存區域(Region)大小為8MB,較大的Region可能減少內存碎片。 ??建議??:通常根據堆大小自動計算,顯式設置需結合應用特性。 |
8 | -XX:InitiatingHeapOccupancyPercent=45?? | ??當堆內存使用率達到45%時,啟動G1的并發標記周期(Concurrent GC)。 ??目的??:盡早回收垃圾,避免堆占用過高時觸發Full GC。 |
9 | -XX:+HeapDumpOnOutOfMemoryError?? | ??在發生內存溢出(OOM)時自動生成堆轉儲文件(java_pid<pid>.hprof),用于事后分析內存泄漏。??文件位置??:默認在JVM工作目錄,可通過-XX:HeapDumpPath指定路徑。 |
10 | -XX:-OmitStackTraceInFastThrow?? | ??禁用JVM對頻繁拋出異常的堆棧軌跡優化,確保所有異常都有完整的堆棧信息。??背景??:JVM默認會省略高頻異常(如NullPointerException)的堆棧,可能影響調試。 |
11 | -Doracle.jdbc.useNio=false?? | 禁用Oracle JDBC驅動的NIO(非阻塞IO)模式,強制使用傳統IO。??適用場景??:某些舊版本驅動或網絡環境下NIO可能導致問題。 |
12 | -Dsun.zip.disableMemoryMapping=true?? | ??禁止使用內存映射文件處理ZIP/JAR,改用流式讀取,避免內存映射導致虛擬內存地址耗盡。??典型問題??:處理大量JAR文件時可能出現的OutOfMemoryError: Map failed。 |
13 | -Dorg.apache.el.parser.COERCE_TO_ZERO=true?? | ??強制將空字符串轉換為數值0(例如,表單提交的空字段解析為0),避免EL表達式類型轉換異常。??示例??:${param.value} 若為空會返回0而非報錯。 |
14 | -Djgroups.bind_addr=0.0.0.0?? | 設置JGroups(集群通信庫)綁定所有可用網絡接口(0.0.0.0),確保集群節點間正常通信。??注??:需確保防火墻開放相關端口。 |
?
?