天天看點

jetty插件java.lang.OutOfMemoryError_ PermGen space記憶體溢出

項目運作時,有時遇到java.lang.OutOfMemoryError: PermGen space問題。

例如啟動線程異步導入excel、excel導出時,會出現如上問題。

原因分析:

PermGen space,全稱是Permanent Generation space,指的是記憶體中的永久區域。當java中間件啟動時,會将相關的jar包和.class加載到永久區域,而用就區域的空間是固定的,雖然可以設定。報這個錯的原因就是在啟動加載.class時,永久區域溢出了。

項目具體分析:異步導入excel會啟動線程、請求多次後線程一直等待、資源沒有釋放。另外excel導出時本項目會調用很多資源。開發過程中預設配置配置設定的空間不足。伺服器部署一般記憶體很大,同樣情況下沒有出現OutOfMemoryError異常。是以本地開發需要修改jvm的參數。

開發中處理:

設定run as —>run configuragtions—>jre标簽下的屬性VM arguments:

-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

參考說明:

1.參數的含義

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

-vmargs 說明後面是VM的參數,是以後面的其實都是JVM的參數了

-Xms128m JVM初始配置設定的堆記憶體

-Xmx512m JVM最大允許配置設定的堆記憶體,按需配置設定

-XX:PermSize=64M JVM初始配置設定的非堆記憶體

-XX:MaxPermSize=128M JVM最大允許配置設定的非堆記憶體,按需配置設定

2.堆記憶體配置設定

JVM初始配置設定的堆記憶體由-Xms指定,預設是實體記憶體的1/64;JVM最大配置設定的堆記憶體由-Xmx指定,預設是實體記憶體的1/4。預設空餘堆記憶體小于40%時,JVM就會增大堆直到-Xmx的最大限制;

空餘堆記憶體大于70%時,JVM會減少堆直到-Xms的最小限制。是以伺服器一般設定-Xms、-Xmx 相等以避免在每次GC 後調整堆的大小。

說明:如果-Xmx 不指定或者指定偏小,應用可能會導緻java.lang.OutOfMemory錯誤,此錯誤來自JVM,不是Throwable的,無法用try…catch捕捉。

3.非堆記憶體配置設定

JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。

4.JVM記憶體限制(最大值)

首先JVM記憶體限制于實際的最大實體記憶體,假設實體記憶體無限大的話,JVM記憶體的最大值跟作業系統有很大的關系。簡單的說就32位處理器雖然可控記憶體空間有4GB,但是具體的作業系統會給一個限制,

這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統下為2G-3G),而64bit以上的處理器就不會有限制了。