注意:我使用mojarra 2.1.20和豐富的面孔4.2.2。JSF通過EL和複合組件泄漏內存
我分析過一個heapdump,我注意到EL表達式駐留在會話的LRUMap中。有誰知道爲什麼和如何做以避免它?
我的問題是關係到含有以下行復合部件:
<rich:select ... valueChangeListener="#{cc.listValuesChangeListener}"
與支持bean my.package.MultiComboSelection。顯然my.package.MultiComboSelection有一個名爲listValuesChangeListener的方法。
我看到的問題是LRUMap包含ContextualCompositeMethodExpression(上面的valueChangeListener表達式的表示),其中cc屬性引用MultiComboSelection。 MultiComboSelection擴展UINamingContainer,並且具有父/子屬性 - 具有對組件樹的引用。
結果是16MB內存不能被垃圾收集,因爲有一個參考鏈:
會話級> LRUMap-> ContextualCompositeMethodExpression-> MultiComboSelection->父 和16MB
現在的問題是 - 爲什麼會發生這種情況,以及如何解決或解決這個問題?
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 |
--------------------------------------------------------------------------------------------------------------------------------------------
謝謝。我會報告這個問題。 – mabn
我們受此影響。從堆轉儲清楚地看到,ContextualCompositeMethodExpression每個都佔用了6.5 MB。解決方法確實解決了問題。 – ymajoros