[ 
https://issues.apache.org/struts/browse/STR-2976?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul Benedict updated STR-2976:
-------------------------------

    Fix Version/s: 1.4.0

> NestedRootTag and NestedPropertyTag's doStartTag() could return 
> EVAL_BODY_INCLUDE
> ---------------------------------------------------------------------------------
>
>                 Key: STR-2976
>                 URL: https://issues.apache.org/struts/browse/STR-2976
>             Project: Struts 1
>          Issue Type: Improvement
>          Components: Taglibs
>    Affects Versions: 1.3.5
>            Reporter: Hayden Foot
>             Fix For: 1.4.0
>
>
> The nested:nest (NestedRootTag) and nested:root (NestedRootTag) only set 
> context and scope for other tags within its body, they do not output any 
> content themselves or manipulate the content with in their body, and yet they 
> return EVAL_BODY_TAG (equivalent to EVAL_BODY_BUFFERED) rather than 
> EVAL_BODY_INCLUDE.  This means a new BodyContent object is created for the 
> body rather than using the existing one (passed through to the current out).
> This can be an issue if the body of either a nested:nest or a nested:root tag 
> generates a large amount of data because the BodyContent object of the tag's 
> body will not flush to the underlying stream until the tag's body is 
> complete.  When running under Tomcat the BodyContent implementation is 
> org.apache.jasper.runtime.BodyContentImpl, and because these objects are 
> pooled and their underlying buffers (char[]) will grow (but not shrink), when 
> rendering large pages (i.e. large content inside nested:nest or nested:root 
> tags)  the BodyContent object used for the tag's body can grow very large 
> (because it can not flush) and will also be retained after the page has 
> rendered (because the object is pooled - hence not released).
> I have experimented by extending the NestedPropertyTag and NestedRootTag 
> classes and overriding the doStartTag() method in the following way:
>   public int doStartTag() throws JspException {
>     super.doStartTag();
>     return EVAL_BODY_INCLUDE;
>   }
> In a test case, using this implementation rather than returning 
> EVAL_BODY_TAG, meant the body of the tag could stream/flush and hence did not 
> need to grow the BodyContent buffer.  The result was that the retained memory 
> (of BodyContentImpl) was significantly reduced (approx 35k as opposed to > 
> 100M).
> I proposed that you change the implementation of both NestedRootTag and 
> NestedPropertyTag's doStartTag() method to return EVAL_BODY_INCLUDE as there 
> is no obvious reason why it needs to buffer the body.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to