linux/centos 解決Tomcat記憶體溢出

來源:互聯網
上載者:User

標籤:linux 記憶體溢出 tomcat 記憶體 jdk centos

    Tomcat本身不能直接在電腦上運行,需要依賴於作業系統和一個JAVA虛擬機器。JAVA程式啟動時JVM會分配一個初始記憶體和最大記憶體給APP。當APP需要的記憶體超出記憶體的最大值時虛擬機器就會提示記憶體溢出,並且導致應用服務崩潰。


一、常見的Java記憶體溢出有以下三種:

1. java.lang.OutOfMemoryError: Java heap space      即JVM Heap溢出


解釋說明:JVM在啟動的時候會自動化佈建JVM Heap的值,JVM堆的設定是指java程式運行過程中JVM可以調配使用的記憶體空間的設定。其初始空間預設是實體記憶體的1/64,最大空間不可超過實體記憶體。JVM提供-Xmn -Xms -Xmx等選項來進行設定。


出錯情境:在JVM中,如果98%的時間是用於GC,且可用的Heap size不足2%時,將會出現JVM Heap溢出


解決方案:修改JVM Heap的大小。

          


2. java.lang.OutOfMemoryError: PermGen space        即PermGen space溢出


解釋說明:PermGen space是指記憶體的永久儲存地區。這個地區主要存放Class和Meta資訊,Class在被Load時就會被放入PermGen space。


出錯情境:如果APP載入很多CLASS,就可能會出現PermGen space溢出。(因為sun的GC不會在程式運行時對PermGen space進行清理)

          常見於web伺服器對JSP進行pre compile的時候

 

解決方案:修改MaxPermSize大小



3. java.lang.StackOverflowError                     即棧溢出

解釋說明:JVM採用的是棧式的虛擬機器,函數的調用過程都體現在堆棧和退棧上。


出錯情境:通常棧的大小是1-2MB的,如果調用建構函式的 “層”太多,則會出現棧溢出


解決方案:修改程式



二、Tomcat的JVM記憶體溢出解決方案

    在生產環境中,tomcat記憶體設定不好很容易出現JVM記憶體溢,解決方案就是修改Tomcat中的catalina.sh檔案。


在catalina.sh檔案中,找到cygwin=false,在這一行的前面加入參數,具體如下


# vi TOMCAT_HOME/bin/catalina.shJAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"


其他說明:

1.“m”說明單位是MB,否則預設是KB

2.一般使用實體記憶體的80%作為堆大小

3.一般把-Xms和-Xmx設為一樣大

4.一般把-Xmn設定為-Xmx值的1/4

5.一般將堆的總大小的50%到60%分配給新產生的池



三、jvm參數說明:

-server                 一定要作為第一個參數,啟用JDK的server版本,在多個CPU時效能佳 

-Xms                    java Heap初始大小。 預設是實體記憶體的1/64。

-Xmx                    java heap最大值。建議均設為實體記憶體的80%。不可超過實體記憶體。

-Xmn                    java heap最小值,一般設定為Xmx的3、4分之一。

-XX:PermSize            設定記憶體的永久儲存區初始大小,預設值為64M。

-XX:MaxPermSize         設定記憶體的永久儲存區最大大小,預設值為64M。

-XX:SurvivorRatio=2     生還者池的大小,預設是2。如果記憶體回收變成了瓶頸,您可以嘗試定製產生池設定

-XX:NewSize             新產生的池的初始大小。 預設值為2M。

-XX:MaxNewSize          新產生的池的最大大小。 預設值為32M。

+XX:AggressiveHeap      讓jvm忽略Xmx參數,瘋狂地吃完一個G實體記憶體,再吃盡一個G的swap。 

-Xss                    每個線程的Stack大小

-verbose:gc             現實垃圾收集資訊

-Xloggc:gc.log          指定垃圾收集記錄檔

-XX:+UseParNewGC        縮短minor收集的時間

-XX:+UseConcMarkSweepGC 縮短major收集的時間

-XX:userParNewGC        可用來設定並行收集(多CPU)

-XX:ParallelGCThreads   可用來增加並行度(多CPU)

-XX:UseParallelGC       設定後可以使用並行清除收集器(多CPU)


本文出自 “doiido” 部落格,轉載請與作者聯絡!

linux/centos 解決Tomcat記憶體溢出

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.