docs: @Override
      int guessFluffedSize() {
  
          // Get the contribution from the superclass(es)
          int total = super.guessFluffedSize();
  
          // If the parts which contain them are already fluffed up,
          // for each property map (which may be empty) get the estimated fluffed size
          // of the name list and double it to cater for the values too.
  
          // Each property map may be cached in a transient, or in the base JMF or both!
          // If they are in both, we need to include them twice as they are taking up
          // memory twice.
  
          // We only get the API portion of the message if it is already fluffed, as we
          // don't want to fluff it up just for this calculation.
          // It is possible for the message to change under us, due to a lazy copy,
          // such that the api we're given is no longer the correct one. It won't matter in
          // this case however, as we're not updating & we don't really care if the
          // data is out of date. The JsMsgPart returned by getApi or getApiIfFluffed should
          // NEVER usually be cached locally & reused.
          JsMsgPart part = getApiIfFluffed();
          if (part != null) {
              int nameSize = part.estimateFieldValueSize(JsApiAccess.JMSPROPERTY_NAME);
              total += nameSize * 2;
              nameSize = part.estimateFieldValueSize(JsApiAccess.OTHERPROPERTY_NAME);
              total += nameSize * 2;
              nameSize = part.estimateFieldValueSize(JsApiAccess.SYSTEMPROPERTY_NAME);
              total += nameSize * 2;
              nameSize = part.estimateFieldValueSize(JsApiAccess.SYSTEMCONTEXT_NAME);
              total += nameSize * 2;
          }
          // If the api JMF message wasn't fluffed we'll just use a pre-calculated guess.
          else {
              total += FLUFFED_PROPERTIES_GUESS;
          }
  
          // The Hdr2 portion probably is already fluffed as Processor accesses umpteen
          // of its fields. However, just in case it isn't we'll make sure we don't
          // cause it to be fluffed. Again, the returned JsMsgPart must NOT be cached for reuse.
          // If Hdr2 is not already fluffed, just assume there are no MQMD properties.
          part = getHdr2IfFluffed();
          if (part != null) {
              int nameSize = part.estimateFieldValueSize(JsHdr2Access.MQMDPROPERTIES_MAP_NAME);
              total += nameSize * 2;
          }
  
          // Any in the transient map will be counted as overhead of the map +
          // a constant amount per item, taking into account the overhead of String plus object.
          int numProps = 0;
          if (jmsUserPropertyMap != null) {
              total += FLUFFED_MAP_OVERHEAD;
              numProps += jmsUserPropertyMap.size();
  
          }
          if (otherUserPropertyMap != null) {
              total += FLUFFED_MAP_OVERHEAD;
              numProps += otherUserPropertyMap.size();
          }
          if (jmsSystemPropertyMap != null) {
              total += FLUFFED_MAP_OVERHEAD;
              numProps += jmsSystemPropertyMap.size();
          }
          if (systemContextMap != null) {
              total += FLUFFED_MAP_OVERHEAD;
              numProps += systemContextMap.size();
          }
          if (mqMdSetPropertiesMap != null) {
              total += FLUFFED_MAP_OVERHEAD;
              numProps += mqMdSetPropertiesMap.size();
          }
          total += numProps * FLUFFED_MAP_ENTRY_SIZE;
  
          return total;
      }