[ 
https://issues.apache.org/jira/browse/MYFACES-3739?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13691649#comment-13691649
 ] 

Leonardo Uribe commented on MYFACES-3739:
-----------------------------------------

I have changed the title of the issue to be more descriptive about the 
necessary conditions to make it happen. More than a memory leak is a state 
saving leak that under some conditions could cause a memory leak.

This is a known defect of the design done for @ResourceDependency annotation 
and JSF 1.2 state saving. With partial state saving, all components of the tree 
are recreated using Application.createComponent(), so the components added 
using @ResourceDependency annotations are added too. Since those components are 
recreated each time the view is build, there is no need to save them on the 
state. 

But things are different for JSF 1.2 state saving. In this case all instances 
are saved with the state. There missing part is something that recalculate that 
part at each request, but the current spec as is does not consider that.

Any solution that try to keep track of the relationship between the 
@ResourceDependency and the component / renderer that originates it just 
increase the state size too. The consideration is since the state does not grow 
fast enough it is more optimal to keep things simple and let it as is, than try 
a more complex solution that will put a "constant big weight" over the state.

Even so, a solution is feasible, but it will not be easy, because we need in 
this part an algorithm with linear complexity, otherwise the performance will 
be affected, at least with JSF 1.2 state saving. Note the conditions to 
reproduce the problem are very rare.

One option that comes to my mind is with JSF 1.2 state saving scan UIViewRoot 
facets and fill RequestViewContext properly, to ensure the dynamic part takes 
into account the previous added references, and it that way, there will not be 
duplicates. I need to think about that carefully, but at first view it could 
work.
                
> @ResourceDependency annotation + JSF 1.2 state saving + c:if (dynamic 
> section) creates components on each click (UIViewRoot grows)
> ----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MYFACES-3739
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3739
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-314
>    Affects Versions: 2.1.12
>         Environment: myfaces 2.1.12
> Tomcat 6.0.36
>            Reporter: Andrei Zhemaituk
>
> The issue was initially reported against RichFaces: 
> https://issues.jboss.org/browse/RF-13025
> But it does not look like it is anything wrong with RichFaces here.
> The issue is reproducible with pure myfaces when partial state saving is 
> turned OFF e.g. with the following code (every second click on "Toggle" 
> button causes new UIOutput element to be inserted to the view tree):
> {code}
>   <h:form>
>     <h:commandButton value="Toggle" action="#{bean.togglePanelShown}">
>       <f:ajax execute="@this" render="group"/>
>     </h:commandButton>
>     <h:panelGroup id="group">
>       <c:if test="#{bean.panelShown}">
>         <!-- Any component with @ResourceDependency annotation. -->
>         <custom:componentWithResourceDependency/>
>       </c:if>
>     </h:panelGroup>
>   </h:form>
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to