Tomcat內存溢出的原因
在生產環境中tomcat內存設置不好很容易出現內存溢出造成內存原因是不一樣的當然處理方式也不一樣
這裡根據平時遇到的情況和相關資料進行一個總結常見的一般會有下面三種情況
OutOfMemoryError Java heap space
OutOfMemoryError PermGen space
OutOfMemoryError unable to create new native thread
Tomcat內存溢出解決方案
對於前兩種情況在應用本身沒有內存洩露的情況下可以用設置tomcat jvm參數來解決(Xms Xmx XXPermSize XXMaxPermSize)
最後一種可能需要調整操作系統和tomcat jvm參數同時調整才能達到目的
第一種是堆溢出
在JVM中如果%的時間是用於GC且可用的 Heap size 不足%的時候將拋出此異常信息
沒有內存洩露的情況下調整Xms Xmx參數可以解決
Xms初始堆大小
Xmx最大堆大小
但堆的大小受下面三方面影響
相關操作系統的數據模型(bt還是bit)限制(位系統下一般限制在G~G我在 server 系統下(物理內存G和Gjdk)測試 M為操作系統對內存無限制)
系統的可用虛擬內存限制
系統的可用物理內存限制
堆的大小可以使用 java Xmx***M version 命令來測試支持的話會出現jdk的版本號不支持會報錯
Xms Xmx一般配置成一樣比較好比如set JAVA_OPTS= Xmsm Xmxm
第二種永久保存區域溢出
PermGen space的全稱是Permanent Generation space是指內存的永久保存區域這一部分用於存放Class和Meta的信息Class在被 Load的時候被放入PermGen space區域它和和存放Instance的Heap區域不同GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理所以如果你的APP會LOAD很多CLASS的話就很可能出現PermGen space錯誤這種錯誤常見在web服務器對JSP進行pre compile的時候但目前的hibernate和spring項目中也很容易出現這樣的問題可能是由於這些框架會動態class而且jvm的gc是不會清理PemGen space的導致內存溢出
這一個一般是加大XXPermSize XXMaxPermSize 來解決問題
XXPermSize 永久保存區域初始大小
XXPermSize 永久保存區域初始最大值
這一般結合第一條使用比如 set JAVA_OPTS= Xmsm Xmxm XXPermSize=M XXPermSize=M
有一點需要注意java Xmx***M version 命令來測試的最大堆內存是 Xmx與 XXPermSize的 和 比如系統支持最大的jvm堆大小事G那 Xmxm XXPermSize=M 是無法運行的
第三種無法創建新的線程
這種現象比較少見也比較奇怪主要是和jvm與系統內存的比例有關
這種怪事是因為JVM已經被系統分配了大量的內存(比如G)並且它至少要占用可用內存的一半
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28668.html