我正在开发一个使用Oracle ADF Faces的项目。 ADF在标准JSF之上引入了一些额外的范围(pageFlowScope,viewScope和backingBeanScope)。我们使用其中一个ADF作用域viewScope似乎导致我们的会话大小随着时间推移而膨胀。
视图作用域的对象(例如我们的Backing Beans)由ADF管理,并且似乎被放入org.apache.myfaces.trinidadinternal.application.StateManagerImpl $ PageState对象的会话中。会话中这些对象的数量等于web.xml配置文件中的org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS。
一旦所有令牌都“用完”,通过在应用程序中导航,这些对象中最旧的一个将从会话中删除,并且(应该)进行垃圾回收。然而,在会议结束后,很久以后就会发现这个空间的回收。因此,在对应用程序进行负载测试时,我们会看到堆空间使用量逐渐增加,然后导致JVM崩溃。
通过在默认构造函数和finalize方法中添加日志语句(覆盖对象的finalize方法)来监视对象的创建和销毁。关于对象创建的日志记录语句可以在我们期望的时候看到,但是finalize方法的日志记录语句只能在会话到期后才能看到。当使用Oracle JRocket Mission Control触发垃圾收集时,我们会看到堆使用率显着下降,但是没有观察到来自finalize方法调用的任何日志记录。
有没有人想过为什么垃圾收集器在从会话中删除后可能无法回收视图范围对象?
提前致谢。
答案 0 :(得分:0)
您可能希望将bean切换到requestScope。这意味着如果bean处于请求 - 响应周期中,它将被加载,否则就不会。此外,adf-scopes建立在通常的jsf范围之上。