Tomcat There is Insufficient Memory for the Java Runtime Environment to Continue
Issue Summary
Bamboo start-up scripts (setenv.sh) misuses JAVA_OPTS for all JVM arguments. Forked Java processes (e.g. Gradle) on local agents will inherit Bamboo JVM heap and proxy settings
It also has the side-effect of causing the Tomcat stop command to require the same initial heap as the Bamboo JVM. This will cause OOMs (mostly where Xms=Xmx) and not a sufficient amount of available memory to create a second JVM with the same memory requirements.
Expected Results
Use CATALINA_OPTS instead so that the Tomcat stop command does not require the same amount of memory as configured for Bamboo.
Actual Results
Tomcat stop ($BAMBOO_INSTALL/bin/stop-bamboo.sh / shutdown.sh) may Out Of Memory when initializing the heap:
# # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 1431306240 bytes for committing reserved memory. # Possible reasons: # The system is out of physical RAM or swap space # In 32 bit mode, the process size limit was hit # Possible solutions: # Reduce memory load on the system # Increase physical memory or swap space # Check if swap backing store is full # Use 64 bit Java on a 64 bit OS # Decrease Java heap size (-Xmx/-Xms) # Decrease number of Java threads # Decrease Java thread stack sizes (-Xss) # Set larger code cache with -XX:ReservedCodeCacheSize= # This output file may be truncated or incomplete. # # Out of Memory Error (os_linux.cpp:2640), pid=4426, tid=0x00007f42b0539700 # # JRE version: (8.0_162-b12) (build ) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.162-b12 mixed mode linux-amd64 compressed oops) # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again # --------------- T H R E A D --------------- Current thread (0x00007f42a800a000): JavaThread "Unknown thread" [_thread_in_vm, id=4427, stack(0x00007f42b043a000,0x00007f42b053a000)] Stack: [0x00007f42b043a000,0x00007f42b053a000], sp=0x00007f42b05383c0, free space=1016k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xacfb2a] VMError::report_and_die()+0x2ba V [libjvm.so+0x50060b] report_vm_out_of_memory(char const*, int, unsigned long, VMErrorType, char const*)+0x8b V [libjvm.so+0x92d963] os::Linux::commit_memory_impl(char*, unsigned long, bool)+0x123 V [libjvm.so+0x92db89] os::pd_commit_memory(char*, unsigned long, unsigned long, bool)+0x29 V [libjvm.so+0x924e4a] os::commit_memory(char*, unsigned long, unsigned long, bool)+0x2a V [libjvm.so+0x99adf3] PSVirtualSpace::expand_by(unsigned long)+0x53 V [libjvm.so+0x99bdb5] PSYoungGen::initialize_virtual_space(ReservedSpace, unsigned long)+0x75 V [libjvm.so+0x99c71e] PSYoungGen::initialize(ReservedSpace, unsigned long)+0x3e V [libjvm.so+0x2db2b5] AdjoiningGenerations::AdjoiningGenerations(ReservedSpace, GenerationSizer*, unsigned long)+0x345 V [libjvm.so+0x94ef36] ParallelScavengeHeap::initialize()+0x1d6 V [libjvm.so+0xa97bd3] Universe::initialize_heap()+0xf3 V [libjvm.so+0xa9813e] universe_init()+0x3e V [libjvm.so+0x6420f5] init_globals()+0x65 V [libjvm.so+0xa7c8ee] Threads::create_vm(JavaVMInitArgs*, bool*)+0x23e V [libjvm.so+0x6d6cc4] JNI_CreateJavaVM+0x74 C [libjli.so+0x797e] JavaMain+0x9e C [libpthread.so.0+0x7de5] start_thread+0xc5
Workaround
Option 1
Set JVM_MINIMUM_MEMORY in $BAMBOO_INSTALL/bin/setenv.sh to a smaller value (e.g. 512m) so that the Tomcat stop command requires less memory but Bamboo can still scale up to the value of JVM_MAXIMUM_MEMORY.
Option 2
Manually patch this part of your $BAMBOO_INSTALL/bin/setenv.sh to not use JAVA_OPTS for memory settings.
- Backup your setenv.sh before making any modifications
JAVA_OPTS="-Xms${JVM_MINIMUM_MEMORY} -Xmx${JVM_MAXIMUM_MEMORY} ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${JVM_SUPPORT_RECOMMENDED_ARGS} ${BAMBOO_HOME_MINUSD}" JAVA_OPTS=$(echo "$JAVA_OPTS" | sed -e 's/\s*$ -e 's/^\s*//') export JAVA_OPTS
JAVA_OPTS="${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${JVM_SUPPORT_RECOMMENDED_ARGS} ${BAMBOO_HOME_MINUSD}" JAVA_OPTS=$(echo "$JAVA_OPTS" | sed -e 's/\s*$ -e 's/^\s*//') CATALINA_OPTS="-Xms${JVM_MINIMUM_MEMORY} -Xmx${JVM_MAXIMUM_MEMORY} ${CATALINA_OPTS}" CATALINA_OPTS=$(echo "$CATALINA_OPTS" | sed -e 's/\s*$ -e 's/^\s*//') export JAVA_OPTS export CATALINA_OPTS
- This example only migrates the Memory settings to CATALINA_OPTS, you may choose to move JVM_SUPPORT_RECOMMENDED_ARGS to CATALINA_OPTS too if you prefer those arguments to not be inherited by other Java processes forked from Bamboo.
Option 3
Run a modified shutdown command.
- Run bash -x ./catalina.sh stop
- Make sure Bamboo does not stop at the end.
- Look for the java command that is being run after an eval command that end with stop, here is an example:
+ '[' '!' -z '' ']' + eval '"/usr/lib/jvm/java-8-oracle/bin/java"' -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms9512m -Xmx91024m -Djdk.tls.ephemeralDHKeySize=2048 '-Djava.endorsed.dirs="/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/endorsed"' -classpath '"/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/bin/bootstrap.jar:/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/bin/tomcat-juli.jar"' '-Dcatalina.base="/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3"' '-Dcatalina.home="/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3"' '-Djava.io.tmpdir="/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/temp"' org.apache.catalina.startup.Bootstrap stop ++ /usr/lib/jvm/java-8-oracle/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms9512m -Xmx91024m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/endorsed -classpath /home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/bin/bootstrap.jar:/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/bin/tomcat-juli.jar -Dcatalina.base=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3 -Dcatalina.home=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3 -Djava.io.tmpdir=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/temp org.apache.catalina.startup.Bootstrap stop
- Take the full Java Command and remove the -Xms only from this command.
- Run the command. Here is the example:
/usr/lib/jvm/java-8-oracle/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xmx91024m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/endorsed -classpath /home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/bin/bootstrap.jar:/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/bin/tomcat-juli.jar -Dcatalina.base=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3 -Dcatalina.home=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3 -Djava.io.tmpdir=/home/ubuntu/atlassian/bamboo/atlassian-bamboo-6.6.3/temp org.apache.catalina.startup.Bootstrap stop
Source: https://jira.atlassian.com/browse/BAM-20370
0 Response to "Tomcat There is Insufficient Memory for the Java Runtime Environment to Continue"
Post a Comment