Limitations of the Maximum Memory Size
The Broker memory limit feature monitors total memory usage for publishing operations by tracking all memory allocation calls. Using that information, the feature prevents calls for memory if the total Broker memory remaining is insufficient to service a publishing operation. However, because Broker does not track actual heap memory, there are certain circumstances under which the maximum memory limit feature may not be able to prevent the Broker from getting into an extreme out-of-memory condition and exiting.
It is possible for the heap memory to become highly fragmented in such a way that:
amount_memory_requested < (max_memory_size) - (current_total_memory_used)
but the memory allocator is not able to find a contiguous block of memory large enough to satisfy amount_memory_requested for the publication. One way to prevent that scenario is by increasing the SafetyMargin when calculating:
MaxMemorySize = TotalMemory - (OS + OtherSoftware + BrokerProgram + SafetyMargin)
An increased SafetyMargin effectively sets aside contiguous memory chunks that can be used later to satisfy unexpectedly large publication requests. A rule of thumb is to have the SafetyMargin set at 40 to 100 percent of the MaxMemorySize.
An incorrect
TotalMemory value is used in calculating
MaxMemorySize, where the
TotalMemory value is larger than the actual memory available to the
Broker process. This condition should be corrected by using the correct value for
TotalMemory.