Stash crashes due to java.lang.OutOfMemoryError PermGen Space Error
If you're experiencing this issue after upgrading to Stash 3.8+ and are using Java 7, it's likely that the setenv.sh
(setenv.bat
for Windows) was copied from a previous Stash installation you used to have. If this is the case, a new version of the setenv.sh
will need to be obtained from the version of Stash that you're using and any customizations you have (such as setting the heap size) be manually made to the file. You can obtain the same file by downloading your Stash release from our website.
Symptoms
Stash crashes. The following appears in the atlassian-stash.log
:
java.lang.OutOfMemoryError: PermGen space
Cause
What does it generally mean?
The error message java.lang.OutOfMemoryError: PermGen space
this means Java's fixed block for loading class files has been exceeded. Permanent Generation Memory, unlike Java heap space, is the memory allocation for the classes themselves as opposed to the objects created. The addition of more plugins contributes to more consumption of PermGen space and is usually the cause of this error. The error occurs when enough classes are invoked.
Why does it fail if I copy a setenv.sh
from a previous version into the binaries shipped with Stash 3.8+?
A little more context on the change that likely triggered this issue if the setenv.sh
file was copied from an older version into <Stash 3.8 installation directory>/bin is that, as of Stash 3.8 we removed the permgen.sh
script that checked if PermGen
is supported (the suppport to PermGen
been removed in Java 8).
The differences in the setenv.sh
can be seen below:
JAVA_OPTS="-Xms${JVM_MINIMUM_MEMORY} -Xmx${JVM_MAXIMUM_MEMORY} ${JMX_OPTS} ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${JVM_SUPPORT_RECOMMENDED_ARGS} ${STASH_HOME_MINUSD}"
# PermGen size needs to be increased if encountering OutOfMemoryError: PermGen problems. Specifying PermGen size is
# not valid on IBM JDKs
STASH_MAX_PERM_SIZE=256m
if [ -f "${PRGDIR}/permgen.sh" ]; then
echo "Detecting JVM PermGen support..."
. "${PRGDIR}/permgen.sh"
if [ $JAVA_PERMGEN_SUPPORTED = "true" ]; then
echo "PermGen switch is supported. Setting to ${STASH_MAX_PERM_SIZE}\n"
JAVA_OPTS="-XX:MaxPermSize=${STASH_MAX_PERM_SIZE} ${JAVA_OPTS}"
else
echo "PermGen switch is NOT supported and will NOT be set automatically.\n"
fi
fi
JAVA_OPTS="-Xms${JVM_MINIMUM_MEMORY} -Xmx${JVM_MAXIMUM_MEMORY} ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${JVM_SUPPORT_RECOMMENDED_ARGS} ${STASH_HOME_MINUSD}"
# PermGen size needs to be increased if encountering OutOfMemoryError: PermGen problems.
MAX_PERM_SIZE=256m
JAVA_OPTS="-XX:MaxPermSize=${MAX_PERM_SIZE} ${JAVA_OPTS}"
export JAVA_OPTS
From the scripts above, if setenv.sh
was copied over from Stash 3.7- to an environment running on Java 7, the test to check if using PermGen
is allowed always returns false since permgen.sh
is no longer shipped with Stash 3.8+ and the PermGen
size gets set to the default in Java 7, which is too small for Stash and causes the Out of Memory Error.
Resolution
What does it generally mean?
As a rule of thumb, the best course of action is to identify why the PermGen
is being filled up.
You might want to try the following to adjust your PermGen.
Why does it fail if I copy a setenv.sh
from a previous version into the binaries shipped with Stash 3.8+?
If the indications above do not resolve the problem, please raise a support issue on support.atlassian.com. Make sure you generate a heap dump by using How to generate a heap dump before contacting our support and attach it to your issue.