JSF wycieka pamięć za pomocą komponentów EL i kompozytowych

Uwaga: Używam mojarra 2.1.20 i bogatych twarzy 4.2.2.

Przeanalizowałem zrzut sterty i zauważyłem, że wyrażenia EL znajdują się w LRUMap w sesji. Czy ktoś wie dlaczego i co zrobić, aby tego uniknąć?

Mam problem związany z komponentem złożonym zawierającym następującą linię:

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

z fasolą bazową my.package.MultiComboSelection. Oczywiście my.package.MultiComboSelection ma zdefiniowaną metodę o nazwie listValuesChangeListener.

Problem, który widzę, polega na tym, że LRUMap zawiera ContextualCompositeMethodExpression (reprezentacja wyrażenia dla valueChangeListener powyżej), którego atrybut cc odnosi się do MultiComboSelection. MultiComboSelection rozszerza UINamingContainer i jako taki ma właściwości nadrzędny / podrzędny - zawiera odwołania do drzewa komponentów.

W rezultacie 16 MB pamięci nie może być zbierane bezużytecznie, ponieważ istnieje łańcuch referencyjny:

session-> LRUMap-> ContextualCompositeMethodExpression-> MultiComboSelection-> rodzic i 16 MB

Pytanie brzmi: dlaczego tak się dzieje i jak to naprawić lub obejść?

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 |              
--------------------------------------------------------------------------------------------------------------------------------------------

questionAnswers(3)

yourAnswerToTheQuestion