我在tomcat7中使用以下bin配置运行我的spring应用程序,
#!/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开销限制”。
我在哪里做错了?
答案 0 :(得分:1)
对于这种错误,Java工具提供了捕获重要信息的所有机制。不使用它,可能会很复杂,浪费时间。 如果您的问题是可重现的,我建议您在运行Java进程时启用内存调试标志并尝试重现您的问题。
我第一次建议你添加你的catalina opts:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapDumpOOME.log
当抛出OutOfMemory错误时它将创建一个堆转储并且它是免费的,因为它只在发生错误时才消耗资源和CPU。
如果还不够,请启用GCC日志以获取有关使用内存的更多信息 以及gcc在应用程序运行期间的工作方式。
请看https://confluence.atlassian.com/confkb/how-to-enable-garbage-collection-gc-logging-300813751.html 它解释了如何在Tomcat中完成它。
有了它,你应该对缺乏记忆的原因有精确的指示。