java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space
是指內(nèi)存的永久保存區(qū)域, 該區(qū)域被JVM用來存放Class和Meta信息, 該區(qū)域默認(rèn)大小約是4M,并且JVM圾圾回收機不會在運行期對該區(qū)域進(jìn)行清理.隨著應(yīng)用載入的class越來越多(這些class包括所有來自lib包中引入的jar), 當(dāng)該區(qū)域不夠用時,將拋出PermGen space錯誤,這個時候就應(yīng)該手動設(shè)置Perm Size的值, 如: JAVA_OPTS='-XX:PermSize=64m -XX:MaxPermSize=128m', 這個錯誤經(jīng)常發(fā)生在應(yīng)用啟動時,如tomcat中運行過多應(yīng)用,并且每個應(yīng)用都包含相當(dāng)多的lib包時,就可能發(fā)生該錯誤,因為每個應(yīng)用lib包中的class載入時都會占用該區(qū)域一定的內(nèi)存,即使這些應(yīng)用包含相同的jar,當(dāng)這些jar中的class載入時仍可能占用不同的內(nèi)存區(qū)域,所以調(diào)整PermSize大小就是一個選擇,另一個不錯的辦法就是將應(yīng)用中相同的jar包移動到tomcat的lib目錄中,這可以減少Perm區(qū)域的內(nèi)存占用.
java.lang.OutOfMemoryError:Java heap space
JVM堆的內(nèi)存區(qū)域,該區(qū)域是一個運行時數(shù)據(jù)區(qū), 用于分配類的對象, 如我們new出來的實例對象.該區(qū)域可由運行時垃圾回收機清理, JVM在啟動的時候會自動設(shè)置Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。當(dāng)我們在程序運行期間產(chǎn)生的實例對象越來越多,而這些對象又沒有得到及時清理時, 直到這些對象占據(jù)到接近-Xmx的設(shè)置值時就會拋出該錯誤.
舉個例子,如我們在web應(yīng)用的session中保存了太多信息(session保存于服務(wù)器內(nèi)存中),隨著用戶的增多,每個用戶都分別占用著一定的內(nèi)存,當(dāng)同時在線的用戶增加到一定程度時,就可能拋出該內(nèi)存溢出錯誤, 這個時候最直接的解決辦法就是設(shè)置-Xmx的大小(一般建議-Xms與-Xmx設(shè)置一樣大),另一個就是檢查你的session中是否存放了太多不必要的信息. 該錯誤還經(jīng)常發(fā)生在很多后臺線程中,為了處理一些大數(shù)據(jù)量的東西,我們經(jīng)常會在系統(tǒng)中創(chuàng)建一些定時任務(wù),這些定時任務(wù)可能會較長時間占據(jù)著系統(tǒng)的大量內(nèi)存,隨著任務(wù)越來越多,這些線程就可能在不知不覺中引起內(nèi)存溢出錯誤!
- huliqing@huliqing.name
- http://www.huliqing.name