Prior to this release, entities in an entity array in an XBUF message were deserialized into objects during the deserialization phase of message receipt. Bursty traffic containing a large number of messages with a large number of entities in the message's entity arrays could result in a large number of entities being in-flight before they are added to their pools. This can result in large pool sizes effectively resulting in large working heap set size even though the active working set of the heap during steady state is a small fraction of the heap. This release fixes this issue. It does so by holding the serialized form of the entity arrays contained in a message until actual access of the entities. The entities are deserialized on demand on invocation of the generated getXXX() entity array accessor or the next() method of the generated getXXXIterator() entity accessor method. A few points to note related to this change - This change does not affect the behavior of an entity array's generated setter methods
An entity array's getXXX() generated accessor continues to not be a zero garbage accessor. However, with this change, the amount of garbage generated by this method will increase. The increased garbage is released to the garbage collector immediately after the invocation of the getXXX() method as soon as the caller releases its reference to the returned entities. Compatibility Notes: Code generated by versions prior to 3.7 will continue to work with the 3.7 runtime. However, in such a configuration, the getXXXIterator() will not be zero garbage. Messages need to be regenerated using 3.7 code generator for the getXXXIterator() to be zero garbage
3.7 generated code is not compatible with earlier versions of the X runtime. |