Troubleshooting: Out-of-memory error from -Xmxcl classload limit setting (IBM JVM 5.0)
Symptom
A system running the IBM JVM 5.0 crashes with repeated java.lang.OutOfMemoryError
exceptions.
A review of the running application shows that the application is not running out of heap space, and increasing the allocated heap does not prevent the exception. Looking at heap dumps generated after the failure shows that the heap is not full.
Background
IBM's Java Virtual Machine 5.0 has a built-in limit on the number of classloaders that it permits in a JVM. This causes problems when executing applications that dynamically generate Java, including Process Commander.
Process Commander's Rules Assembly subsystem assigns one classloader for each rule that is dynamically converted to Java, compiled into a Java class, and loaded into the JVM. The number of classloader objects that Process Commander uses is proportional to the number of Java classes generated for the rules in a given configuration.
Solution
What to do for IBM JVM 5.0 SR-5 and later
As the classloader limit no longer applies to these JVM versions, look for other causes for an out-of-memory exception. Refer to Support Play: Tuning the IBM JVM 5.0 for performance for information on other out-of-memory errors.
What to do for IBM JVM 5.0 SR-4 and earlier
Updating a JVM to SR-5 or later should correct an -Xmxcl out-of-memory error, and Pegasystems recommends you make this upgrade to the JVM.
If you choose not to upgrade, use the JVM parameter –Xmxcl to set the number of Java classloaders that can be loaded in the JVM at one time to a value greater than the default setting of 8192.
The Pega-recommended value for -Xmxcl is 22,000. To specify the recommended value on the command line, enter: –Xmxcl22000.
If errors persist, start with the value of the Process Commander property fua/global/instancecountlimit, which is set in prconfig.xml, and increase it by 10 percent to provide a margin for growth. The default of instancecountlimit is 20,000. Edit prconfig.xml to set a higher value, and then set -Xmxcl on the command line.
The value assigned to -Xmxcl is JVM-wide, while instancecountlimit applies only to Process Commander. To avoid a possible conflict, ensure that the JVM's -Xmxcl value is set to be greater than PRPC's instancecountlimit value.