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中是否存放了太多不必要的信息. 該錯誤還經常發生在很多后臺線程中,為了處理一些大數據量的東西,我們經常會在系統中創建一些定時任務,這些定時任務可能會較長時間占據著系統的大量內存,隨著任務越來越多,這些線程就可能在不知不覺中引起內存溢出錯誤!


          - huliqing@huliqing.name
          - http://www.huliqing.name

          posted on 2013-08-10 23:43 huliqing 閱讀(2066) 評論(2)  編輯  收藏 所屬分類: Java

          評論

          # re: java.lang.OutOfMemoryError - 關于java的內存溢出 2013-08-18 12:47 tb

          選擇64位系統 64位中間件  回復  更多評論   

          # re: java.lang.OutOfMemoryError - 關于java的內存溢出[未登錄] 2013-09-09 17:28

          不錯,希望樓主再發表一片堆轉儲快照分析的案例,那個我實在不會,這篇不錯,轉了  回復  更多評論   

          導航

          統計

          公告

          文章原創,歡迎轉載
          ——轉載請注明出處及原文鏈接

          隨筆分類(60)

          隨筆檔案(33)

          最新評論

          評論排行榜

          主站蜘蛛池模板: 灌阳县| 紫阳县| 鹰潭市| 辽源市| 安西县| 徐水县| 阿荣旗| 新宾| 开原市| 咸阳市| 尖扎县| 靖远县| 朝阳市| 土默特左旗| 敦化市| 抚远县| 隆德县| 望城县| 赣州市| 瓦房店市| 东乌珠穆沁旗| 饶阳县| 镇康县| 塔河县| 嘉峪关市| 渝中区| 铜山县| 长宁县| 南和县| 汕头市| 平陆县| 穆棱市| 淮滨县| 晴隆县| 嘉义县| 乌鲁木齐市| 饶平县| 大新县| 鲁甸县| 澎湖县| 鹤庆县|