java.lang.OutOfMemoryError - 關於java的內存溢出

java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space
是指內存的永久保存區域, 該區域被JVM用來存放Class和Meta信息, 該區域默認大小約是4M,而且JVM圾圾回收機不會在運行期對該區域進行清理.隨着應用載入的class愈來愈多(這些class包括全部來自lib包中引入的jar), 當該區域不夠用時,將拋出PermGen space錯誤,這個時候就應該手動設置Perm Size的值, 如: JAVA_OPTS='-XX:PermSize=64m -XX:MaxPermSize=128m', 這個錯誤常常發生在應用啓動時,如tomcat中運行過多應用,而且每一個應用都包含至關多的lib包時,就可能發生該錯誤,由於每一個應用lib包中的class載入時都會佔用該區域必定的內存,即便這些應用包含相同的jar,當這些jar中的class載入時仍可能佔用不一樣的內存區域,因此 調整PermSize大小就是一個選擇,另外一個不錯的辦法就是將應用中相同的jar包移動到tomcat的lib目錄中,這能夠減小Perm區域的內存佔用.


java.lang.OutOfMemoryError:Java heap space
JVM堆的內存區域,該區域是一個運行時數據區, 用於分配類的對象, 如咱們new出來的實例對象.該區域可由運行時垃圾回收機清理, JVM在啓動的時候會自動設置Heap size的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。當咱們在程序運行期間產生的實例對象愈來愈多,而這些對象又沒有獲得及時清理時, 直到這些對象佔據到接近-Xmx的設置值時就會拋出該錯誤. 
舉個例子,如咱們在web應用的session中保存了太多信息(session保存於服務器內存中),隨着用戶的增多,每一個用戶都分別佔用着必定的內存,當同時在線的用戶增長到必定程度時,就可能拋出該內存溢出錯誤, 這個時候最直接的解決辦法就是設置-Xmx的大小(通常建議-Xms與-Xmx設置同樣大),另外一個就是檢查你的session中是否存放了太多沒必要要的信息. 該錯誤還常常發生在不少後臺線程中,爲了處理一些大數據量的東西,咱們常常會在系統中建立一些定時任務,這些定時任務可能會較長時間佔據着系統的大量內存,隨着任務愈來愈多,這些線程就可能在不知不覺中引發內存溢出錯誤! java

相關文章
相關標籤/搜索