閱讀898 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Linux和windows下內存溢出以及修改tomcat的jvm內存

一、內存溢出概述

常見的內存溢出有以下兩種:
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
 
①java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很多CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar,其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。
解決方法: 手動設置MaxPermSize大小
建議:將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文檔重複占用內存的目的。


②java.lang.OutOfMemoryError: Java heap space
JVM堆的設置是指java程序運行過程中JVM可以調配使用的內存空間的設置。JVM在啟動的時候會自動設置Heap size的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap size的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常信息。Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值。 
解決方法:手動設置Heap size



二、修改JVM內存

此處以tomcat環境為例,其它WEB服務器原理相似。

①Linux下修改JVM內存大小
在tomcat的bin下的catalina.sh裏,位置cygwin=false前添加:
# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"
cygwin=false
表示初始化內存為256MB,可以使用的最大內存為512MB。

②windows下修改JVM內存大小
情況一:解壓版本的Tomcat, 要通過startup.bat啟動tomcat才能加載配置
要添加在tomcat的bin的catalina.bat
rem Guess CATALINA_HOME if not defined
set CURRENT_DIR=%cd%後麵添加,紅色的為新添加的.
set JAVA_OPTS=-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true
 
情況二:安裝版的Tomcat下沒有catalina.bat
windows服務執行的是bin/tomcat.exe讀取注冊表中的值,而不是catalina.bat的設置
修改注冊表HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Tomcat Service Manager/Tomcat5/Parameters/JavaOptions
原值為
-Dcatalina.home="C:/ApacheGroup/Tomcat 5.0"
-Djava.endorsed.dirs="C:/ApacheGroup/Tomcat 5.0/common/endorsed"
-Xrs
加入-Xms300m -Xmx350m 
重起tomcat服務,設置生效。


更詳細的介紹請參看https://blog.csdn.net/yougou_sully/article/details/6457570#reply
 

最後更新:2017-04-03 16:48:47

  上一篇:go NOD 1147 還原連分數
  下一篇:go Linux和windows下內存溢出以及修改tomcat的jvm內存