2016-07-22 71 views
0

我運行在tomcat7我的Spring應用程序下面倉配置,Tomcat7 - GC開銷超過限制

#!/bin/sh 
# 

CATALINA_HOME=/usr/share/tomcat7 

# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not 
# defined in $DEFAULT) 
JDK_DIRS="/usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun /usr/lib/jvm/java-1.5.0-sun /usr/lib/j2sdk1.5-sun /usr/lib/j2sdk1.5-ibm" 

# Look for the right JVM to use 
for jdir in $JDK_DIRS; do 
    if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then 
     JAVA_HOME_TMP="$jdir" 
     # checks for a real JDK like environment, needed to check if 
     # really the java-gcj-compat-dev package is installed 
     if [ -r "$jdir/bin/jdb" ]; then 
      JAVA_HOME="$JAVA_HOME_TMP" 
     fi 
    fi 
done 
CATALINA_OPTS="-server -Xms512M -Xmx512M -XX:+UseG1GC" 

# Default Java options 
if [ -z "$JAVA_OPTS" ]; then 
     #JAVA_OPTS="-Djava.awt.headless=true -Xmx128M" 
     JAVA_OPTS="-server -Xms512M -Xmx512M -XX:+UseG1GC" 
fi 

不過還是我面對 「java.lang.OutOfMemoryError:GC開銷超過限制」。

我在哪裏犯錯?

+1

這取決於。您的應用程序是否處理大量數據?你在tomcat中運行了很多應用程序嗎?那麼512m堆可能不夠用。或者你的應用程序可能泄漏內存然後修復應用程序。記憶轉儲並使用例如eclipse mat來分析它。 –

回答

1

對於這種錯誤,Java工具提供了捕獲重要信息的所有機制。如果不使用它,可能會很複雜,浪費時間。 如果您的問題是可複製的,我建議您在運行java進程時啓用內存調試標誌並嘗試重現您的問題。

在第一時間,我建議你在你的卡塔利娜加選擇採用:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapDumpOOME.log 

當內存不足錯誤被拋出這將創建一個堆轉儲因爲它消耗資源和CPU它是免費的只有在錯誤發生。

如果還不夠,請啓用GCC日誌以獲取有關使用內存的更多信息 以及gcc在應用程序運行期間的工作方式。

看看https://confluence.atlassian.com/confkb/how-to-enable-garbage-collection-gc-logging-300813751.html
它解釋瞭如何在Tomcat中完成它。

有了它,你應該精確地指出你的記憶缺乏的原因。

相關問題