How to change Java heap size in R12 to avoid java.lang.OutOfMemoryError: Java heap space error?
Recently we had encountered a situation, wherein end users where not able to get the R12 login page and
it just hangs, but all the opmn processess were up and running – adopmnctl.sh status gives status as
alive for all the components viz., HTTP, oafm, oacore & forms. The same environment was available and
end users were able to access without any isuses 15 minutes before. This error happens only when
multiple people login to the same page and perform simillar activity like employee self service form
etc. So where and what exactly could be the problem.
This is how we approached and resolved the issue.
First we checked apache error log. The following error was reported in the error log.
[warn] [client IP Address ] oc4j_socket_recvfull timed out
[error] [client IP Address ] mod_oc4j: There is no oc4j process (for destination: application://oacore) available to service request.
[error] [client IP Address] mod_oc4j: request to OC4J [servername:OC4J AJP Port Range for Oacore]
failed: Connect failed
Above error message does give us a hint that the problem is with oacore, but as i said earlier the oacore is alive according to opmn.
Next, we verified the oacore log file.
Error Message in the file
Exception in thread “OC4JMonitorThread” java.lang.OutOfMemoryError: Java heap space
While checking the error in file, parallely we opened another window to see the CPU and memory usage and we could see one java process was taking more than 100% CPU. This process was spawned by the opmn -d process and the process id didnt match with the oacore process id. Hint: adopmnctl.sh status will give the status as well the process id. It looked like a end client java process.
At this stage we had 3 options.
1. Kill the java process which is consuming high cpu.
2. Bounce oacore component
3. Adjust java (jvm) memory parameters
Each of the above options has its own implications and advantages. To minimize the downtime we decided to kill the java processes, and the moment we killed the java process, all the browsers which were hanging reported instantaneously Internal Server Error. This proved to be a bad decision.
So we moved to the next option, bouncing the oacore service which we are sure will resolve the issue (temporarily) and it did as expected. Basically when you bounce the services all the existing
connections and processess will be released which results in more available memory when you re-start the services.
Ok, now we tackled the problem and provided a temporary solution but we need to find a long term solution. This is option 3, adjusting java memory size.
Steps to change the heap size.
First, you need to identify how much is the maximum heap size that you can set. Click here.
Once you had identified the maximum heap size, we need to change the configuration files to make it
Step 1: Edit opmn.xml file.
Location : $INST_TOP/ora/10.1.3/opmn/conf/
Search for string Xms or Xmx or module-id=”OC4J”
This search should lead you to below location
‘<‘process-type id=”oacore” module-id=”OC4J” status=”enabled” working-dir=”$ORACLE_HOME/j2ee/home”‘>’
‘<‘data id=”java-options” value=”-server -verbose:gc -Xmx512M -Xms128M ……]
The default value for Maximum (-Xmx) and Minimum (-Xms) heap sizes are 512M and 128M respectively.
Again here you have options, you can set both Xms and Xmx has the same value as Xmx if you feel all your sessoins require higher memory or set a lower value for Xms and the maximum value for Xmx. Dont forget to change the values under ‘<‘category id=”stop-parameters”‘>’
opmn.xml also contains jvm configurations for other components – oafm & forms.
Step 2: Edit oc4j.properties file.
Location : ($INST_TOP/ora/10.1.3/j2ee/oacore/config)
This step is optional since we had already made changes in opmn.xml but there is no harm in making the change here. This step will come handy for troubleshooting specific components of Oracle viz., configurator, iSupplier or any other option which heavily utilizes/consumes CPU/memory.
Search for string Xms or Xmx or wrapper.
Option 1: If you find any of the above parameters change the values corresponding to the value you had mentioned in opmn.xml or even more than that, as long as you dont exceed the maximum heap size limit.
Option 2: If you DO NOT find any of the above parameters, then make an entry like this, under the heading “# Java Object Cache Configuration Parameters”
wrapper.bin.parameters=-Xms[Value]M -Xmx[Value]M -XX:NewSize=256M -XX:MaxNewSize=256M
Step 3: Edit Applications Context file
search for string s_oacore_jvm_start_options
Change Xms and Xmx value. Repeat the same step for parameter s_oacore_jvm_stop_options.
Changes made in Step 3 will take effect the next time you run autoconfig, whereas Step 1 & 2 changes will take effect the next time you bounce opmn services, but the values are not permanent in the sense these will be wiped off next time you run autoconfig. Yes you can preserve the changes by placing it inbetween Begin and End customizations.
You can also increase the Garbage Collection threads parameter (-XX:ParallelGCThreads) to a higher value if you have JDK 1.5 or more than 2 cpus or more memory. For more information on this you can refer to Metalink Note: 362851 – Guidelines to setup the JVM in Apps Ebusiness Suite 11i and R12.