標籤:
1. 問題描述當從資料庫中查詢大量的資料,每個模板取出來幾百萬條資料,或者是頻繁的重新整理項目、模板時就會佔用Java虛擬機器JVM的大量記憶體,超過記憶體就會出現報java.lang.OutOfMemoryError:Java heap space記憶體一處的錯誤,具體報錯如下:2. 原因由於伺服器的JVM不夠用而拋出的錯誤,
JVM在啟動的時候會自動化佈建Heap size的值,初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。所以可以根據自己的情況進行修改JVM的-Xmn -Xms -Xmx等選項。
2.1 記憶體大小設定當Heap Size設定偏小,除了報異常資訊外,還會發現執行報表的速度變慢了。
Heap Size最大不要超過可用實體記憶體的80%,一般的要將-Xms和-Xmx選項設定為相同,而-Xmn為1/4的-Xmx值。Heap size的 -Xms -Xmn 設定不要超出實體記憶體的大小。否則會提示“Error occurred during initialization of VM Could not reserve enough space for object heap”3. 解決方案3.1 調大伺服器的記憶體下面我們以tomcat為例,來查看下如何修改記憶體大小。修改伺服器的記憶體溢出在TOMCAT_HOME\bin\catalina.bat 中添如下代碼:
- set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m
或者在開始程式 tomcat目錄下面的Configure Tomat開啟選擇Java設定記憶體大小其他伺服器的記憶體修改可以參考伺服器記憶體修改文檔。3.2 啟用磁碟緩衝我們預設使用的是記憶體緩衝,就是取出的資料全部放在伺服器記憶體中,此時若資料量大的情況下就很可能會導致記憶體不夠用,改為磁碟緩衝,就是將取出的資料部分放在記憶體中,部分放在磁碟中,這樣可以減少伺服器記憶體佔用,但是從磁碟中讀取資料會造成取數效率下降,增長時間的。具體的操作可查看資料集緩衝與共用的緩衝至磁碟小節。 Tomcat伺服器並發數查看與修改1. 問題描述使用者訪問某張報表時,伺服器就使用一個線程來處理報表運算。如果訪問的人數太多且報表運算量大的話,同一時間爭搶伺服器cpu線程的人就會很多。伺服器響應能力就會減弱,所以我們需要合理控制伺服器線程個數。2. 設定方法2.1 設定方式我們可以通過修改Tomcat伺服器的配置,來控制線程數。開啟%Tomcat_HOME%/conf/server.xml文檔,找到<Connector port="8080"....>一欄。在Connector port = "8080"後面加上相應地參數控制線程數,控制參數如下:minProcessors:最小空閑連接線程數,用於提高系統處理效能,預設值為10maxProcessors:最大連接線程數,即:並發處理的最大請求數,預設值為75acceptCount:允許的最大串連數,應大於等於maxProcessors,預設值為100設定完成後如同: <Connector port="8080" minProcessors="150" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
2.2 注意事項
web server允許的最大串連數還受制於作業系統的核心參數設定,通常Windows是2000個左右,Linux是1000個左右。這裡的串連數是無法直接給出最佳配置的,需要根據您的實際情況,在不斷調整,不斷測試的基礎上,才能到到最合理配置。
記憶體大小設定 Java heap space錯誤(finereport報表)