Fuga de memoria JSF a través de componentes EL y compuestos.

Nota: estoy usando mojarra 2.1.20 y caras ricas 4.2.2.

He analizado un heapdump y he notado que las expresiones EL residen en LRUMap en la sesión. ¿Alguien sabe por qué y qué hacer para evitarlo?

El problema que tengo está relacionado con un componente compuesto que contiene la siguiente línea:

  <rich:select ... valueChangeListener="#{cc.listValuesChangeListener}"

con respaldo de frijol my.package.MultiComboSelection. Obviamente my.package.MultiComboSelection tiene un método definido llamado listValuesChangeListener.

El problema que veo es que LRUMap contiene ContextualCompositeMethodExpression (representación de la expresión para valueChangeListener anterior), cuyo atributo cc hace referencia a MultiComboSelection. MultiComboSelection extiende UINamingContainer y, como tal, tiene propiedades padre / hijo: tiene referencias al árbol de componentes.

El resultado es que 16 MB de memoria no se pueden recolectar porque hay una cadena de referencia:

session-> LRUMap-> ContextualCompositeMethodExpression-> MultiComboSelection-> parent y 16MB

La pregunta es: ¿por qué está sucediendo y cómo solucionarlo o solucionarlo?

Class Name                                                                                   | Shallow Heap | Retained Heap | Retained Heap
--------------------------------------------------------------------------------------------------------------------------------------------
my.package.MultiComboSelection @ 0x78dc2bd50                                                 |           96 |    16 466 272 |    16 466 272
|- component javax.faces.component.UIComponentBase$FacetsMap @ 0x78dbbbd58                   |           48 |           128 |              
|- parent javax.faces.component.UIPanel @ 0x78dbbbdd8                                        |           88 |           760 |              
|- cc com.sun.faces.facelets.el.ContextualCompositeMethodExpression @ 0x78dc2bce0            |           32 |    16 466 384 |              
|  |- [0] java.lang.Object[2] @ 0x78dc2bc90                                                  |           24 |    16 466 464 |              
|  |  '- [0] java.lang.Object[1] @ 0x78dc2bc78                                               |           24 |    16 466 488 |              
|  |     '- [0] java.lang.Object[5] @ 0x78dc2bc20                                            |           40 |    16 466 576 |              
|  |        '- [0] java.lang.Object[2] @ 0x78dc2bc08                                         |           24 |    16 466 600 |              
|  |           '- [0] java.lang.Object[4] @ 0x78dc2bbe8                                      |           32 |    16 466 632 |              
|  |              '- value java.util.HashMap$Entry @ 0x78dc2bb40                             |           32 |    16 466 800 |              
|  |                 '- [1579] java.util.HashMap$Entry[2048] @ 0x78dbf61b8                   |        8 208 |    33 552 536 |              
|  |                    '- table java.util.HashMap @ 0x78dbb6860                             |           48 |    33 552 584 |              
|  |                       '- [1] java.lang.Object[2] @ 0x78ad95340                          |           24 |    33 552 608 |              
|  |                          '- value java.util.LinkedHashMap$Entry @ 0x78ad952c0           |           40 |    33 552 736 |              
|  |                             |- after, before java.util.LinkedHashMap$Entry @ 0x78acbe6a0|           40 |            40 |              
|  |                             |- [0] java.util.HashMap$Entry[2] @ 0x78ad952a8             |           24 |            24 |              
|  |                             |  '- table com.sun.faces.util.LRUMap @ 0x78ad95270         |           56 |    33 552 856 |              
--------------------------------------------------------------------------------------------------------------------------------------------

Respuestas a la pregunta(3)

Su respuesta a la pregunta