內存大小設置 Java heap space錯誤


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最大不要超過可用物理內存的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 中添如下代碼:
 
  1. set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m  
3.2 啟用磁盤緩存
我們默認使用的是內存緩存,就是取出的數據全部放在服務器內存中,此時若數據量大的情況下就很可能會導致內存不夠用,改為磁盤緩存,就是將取出的數據部分放在內存中,部分放在磁盤中,這樣可以減少服務器內存占用,但是從磁盤中讀取數據會造成取數效率下降,增長時間的。
具體的操作可查看 數據集緩存與共享的緩存至磁盤小節。
 
 
 
1. 問題描述
用戶訪問某張報表時,服務器就使用一個線程來處理報表運算。
如果訪問的人數太多且報表運算量大的話,同一時間爭搶服務器cpu線程的人就會很多。服務器響應能力就會減弱,所以我們需要合理控制服務器線程個數。
2. 設置方法
2.1 設置方式
我們可以通過修改Tomcat服務器的配置,來控制線程數。
打開 %Tomcat_HOME%/conf/server.xml文檔,找到<Connector port="8080"....>一欄。
Connector port = "8080"后面加上相應地參數控制線程數,控制參數如下:
minProcessors:最小空閑連接線程數,用於提高系統處理性能,默認值為10
maxProcessors:最大連接線程數,即:並發處理的最大請求數,默認值為75
acceptCount:允許的最大連接數,應大於等於maxProcessors,默認值為100
設置完成后如同:  <Connector port="8080" minProcessors="150" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
2.2 注意事項
web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。
這里的連接數是無法直接給出最佳配置的,需要根據您的實際情況,在不斷調整,不斷測試的基礎上,才能到到最合理配置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM