1. 概述
1.1 問題描述
使用者工程部署在 Tomcat 容器中,若遇到以下問題:
記憶體上限溢位錯誤:java.lang.OutOfMemoryError:Java heap space
FineDataLink 記憶體佔用過高。
Tomcat 後台提示 Memory is over threshold
報錯:記憶體上限溢位。
想調整 Tomcat 的預設記憶體。
伺服器壓力大。
需要將 FineDataLink 工程所在的 Tomcat 伺服器記憶體調大,可參考本文方法解決。
1.2 解決思路
為了避免記憶體上限溢位的問題,一方面應適當啟動磁碟快取,另一方面可以根據實際情況調整伺服器記憶體大小。
本文將詳細說明如何調整 Tomcat 伺服器記憶體大小。
2. 修改Tomcat伺服器記憶體
本文僅介紹 Tomcat 類型伺服器記憶體的修改方法。
建議修改的記憶體相關配置項包括:
記憶體配置參數 | 說明 | 建議值 |
---|---|---|
Xmx | 指定 Java 堆的最大記憶體大小 它設定堆的上限,當堆大小達到該值時,JVM將停止分配新的記憶體並觸發垃圾回收 | 建議大於 16G ,但不建議超過 80% 的系統記憶體 使用者可在 健康巡检查看推薦的「堆內記憶體」大小(Xmx 值) |
Xms | 指定 Java 堆的初始記憶體大小 它設定堆的初始大小,JVM 會在啟動時分配該大小的記憶體 | 建議 Xms = Xmx |
MaxDirectMemorySize | 堆外 NIO 記憶體,指定直接記憶體(Direct Memory)的最大大小 直接記憶體不受 Java 堆大小的限制,透過本地記憶體直接分配,而不是在 Java 堆中分配 | 建議 2GB,參考值2~4GB 最小 2GB,不限制最大值,但需要考慮使用者伺服器記憶體的大小,FineDataLink 使用的記憶體(BIMax)<= 使用者伺服器記憶體 * 7/8 |
Dfineio.read_mem_limit | fineIO 讀記憶體 | 建議 2GB |
Dfineio.write_mem_limit | fineIO 寫記憶體 | 建議 1GB |
2.1 透過startup.bat、startup.sh啟動
若 Tomcat 是透過 startup.bat、startup.sh 啟動的,參考本章方法修改伺服器記憶體。
2.1.1 Linux
1)進入%Tomcat_HOME%\bin目錄。尋找名為setenv.sh的檔案。如果檔案不存在,可以建立一個新的setenv.sh檔案。
注:請確定setenv.sh檔案具有可執行權限。如果沒有可執行權限,可以使用以下命令進行設定:chmod +x setenv.sh
2)使用正文編輯器開啟setenv.sh檔案。在檔案中新增以下行來設定:
注:以上配置僅為參考配置,您可根據上方表格,依據部署所在伺服器情況調整配置參數。
3)儲存並關閉 setenv.sh 檔案。
4)重啟 Tomcat 伺服器以使修改生效。管理者登入工程,選擇「管理系統>智慧維運>負載管理>負載監視」,可以看到實時記憶體情況,如下圖所示:
2.1.2 Windows
1)進入%Tomcat_HOME%\bin目錄。尋找名為setenv.bat的檔案。如果檔案不存在,可以建立一個新的setenv.bat檔案。
2)使用正文編輯器開啟setenv.bat檔案。在檔案中新增以下行來設定:
注:以上配置僅為參考配置,您可根據上方表格,依據部署所在伺服器情況調整配置參數。
3)儲存並關閉 setenv.bat 檔案。
4)重啟 Tomcat 伺服器以使修改生效。
管理者登入工程,選擇「管理系統>智慧維運>負載管理>負載監視」,可以看到實時記憶體情況,如下圖所示:
2.2 Tomcat 為安裝版本
若透過服務啟動 Tomcat,即不是透過 startup.bat、startup.sh 啟動 Tomcat 的,參考本章方法解決。
本章以 Win10+Tomcat8+JDK1.8 為例(不同版本可能略有不同請自行處理)。
2.2.1 方法一
1)直接雙擊 Tomcat 出現在螢幕右下角的系統托盤,開啟Java選項卡,修改Initial Memory Pool和Maximum Memory Pool即可。
前者為初始記憶體,後者為最大記憶體,最大記憶體儘量不要超過物理記憶體的 80% 。
2)修改後,重啟 Tomcat 設定生效。
2.2.2 方法二
1)在註冊表編輯器中,找到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat8\Parameters\Java(路徑可能有一點差別)。
修改 JvmMs(初始化記憶體)和 JvmMx(最大記憶體):
2)重啟Tomcat,設定生效。
管理者登入工程,選擇「管理系統>智慧維運>負載管理>負載監視」,可以看到實時記憶體情況,如下圖所示: