熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Tomcat內存溢出的原因

2013-11-23 20:33:49  來源: Java開源技術 

  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 XmxXXPermSize=M XXPermSize=M

  有一點需要注意java Xmx***M  version 命令來測試的最大堆內存是 Xmx與 XXPermSize的 和 比如系統支持最大的jvm堆大小事G那  XmxXXPermSize=M 是無法運行的

  第三種無法創建新的線程

  這種現象比較少見也比較奇怪主要是和jvm與系統內存的比例有關

  這種怪事是因為JVM已經被系統分配了大量的內存(比如G)並且它至少要占用可用內存的一半


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28668.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.