在進行 Street Test 時,發覺 Server 上的 Memory 用得異常地多。經調查後發現 RichFaces 其中一個 Object - AjaxStateHolder 佔用大量 Memory。如果是使用 3.2.0.SR1 之前的版本更加嚴重,Session 隨時佔用 1 Gigabytes 的 Memory。
解決方法就是在 web.xml 加入以下設定:
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>1</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>1</param-value>
</context-param>
因為每運行一次 JSF 的 View 時都會將這個 View 放到 Session 內,而且同一個 View 亦會再儲存多一次在 Session,因為這些 Session 仍然在使用中,JVM GC 無法將不用的 View 回收,做成 Memory 使用量不斷增加。
限制 View 數量後就可以解決這個問題。
RichFaces bug: https://issues.jboss.org/browse/RF-3878
相關書籍: