User runs a consolidation (e.g. Consolidate with Status) which includes AFC calculations. After this has finished running, user opens the 'batch queue'. Intermittently, inside the 'batch queue' there is an error message (in the job details).
<time> Advanced Formula Calculation is started.
Error in AFC:!java.lang.OutOfMemoryError!
Execution of AFC not OK for: xxxxx
<time + x> Advanced Formula Calculation is finished
NOTE: The error does appear all the time (intermittent issue).
The JAVA JRE environment (which hosts the AFC calculation engine) has run out of memory.
By default, the version of JRE that comes with Controller 10.1.1308 (and earlier) has the following memory limitations:
- Initial RAM = 256 Mb
- Maximum RAM = 512 Mb
By default, the version of JRE that comes with Controller 10.1.1 FP1 (10.1.1671) and later has its RAM settings 'dynamically' configured.
- In other words, the JRE will attempt to allocate as much RAM as it needs (using its own algorithm) without fixed limitations.
Problem could potentially affect any environment, but it is much more likely for customers who are:
(1) Using versions of Controller *before* 10.1.1 FP1 (10.1.1671)
(2) Running multiple batch process servers.
- For example, in the following real-life example the customer is running 3:
- The intermittent nature of the problem is explained by the fact that (randomly) there may have multiple concurrent AFC jobs running that swamp the available memory for the JAVA JRE environment.
Diagnosing the problem
To check what the current default JAVA memory configuration is (on the Controller application server), perform the following:
1. Launch a Command Prompt
2. Change directory to the folder where the Controller JAVA is located, for example:
cd C:\Program Files\IBM\cognos\c10\bin\jre\6.0\bin
3. Run the following command:
java -verbose:sizes -version
Resolving the problem
Upgrade Controller to version 10.1.1 FP1 (10.1.1671) or later.
TIP: After upgrading to Controller 10.1.1 FP1, you must:
- Open the "...C10\server" folder.
- By default this is located here: C:\Program Files (x86)\IBM\cognos\c10\server
- Check to see if a file 'CCRProxy.options' exists in there.
- By default it will not exist, but it may have been created in the past to overcome a similar problem (see below)
- If the file 'CCRProxy.options' exists, then delete it
- This is to ensure that its values do not overwrite the default (good) behaviour of the new JRE.
(1) Reduce the number of batch services running to 1
or (2) Increase the available memory available to the 32-bit JRE (Java environment).
Steps for (2) - to increase the available memory to the 32-bit JRE
NOTE: This can give more stability (fewer errors), but it *may* not solve the problem 100% entirely.
IMPORTANT: The settings should *only* be changed if using 10.1.1308 (and earlier)
- If using Controller (10.1.1671) and later then the file "CCRProxy.options" should NOT be used (or even exist - delete the file if necessary!) since this version of Controller already correctly/dynamically allocates memory in its JRE.
- Logon to the Controller application server as a Windows administrator
- Browse to the folder ...c10\server (TIP: By default, this is here: C:\Program Files (x86)\IBM\cognos\c10\server)
- Check to see if the file CCRProxy.options exists. By default this file will not exist. If it does exist then (as a precaution) create a backup of the file (for example, copy it to CCRProxy.options.backup)
- Save the file CCRProxy.options (attached to this Technote) inside that folder
- Right-click on "My Computer" and choose "Manage"
- Open the section "Services"
- Restart the Windows service "IBM Cognos Controller Java Proxy"
The file should contain two parameters, which contains the memory sizes for initial and maximum heap size. The attached file contains the following text:
By using this file, you increase (double) the maximum heap size from the default (512Mb) to 1024 Mb. 1024Mb should be enough for most customer's needs, although (naturally) it can be increased if necessary.
- TIP: Naturally you must ensure that your Controller application server has sufficient memory physically installed in the server, so that it can cope with this extra memory requirement.