我正在开发一个使用 Oracle ADF Faces 的项目。ADF 在标准 JSF 的基础上引入了一些额外的范围(pageFlowScope、viewScope 和 backingBeanScope)。我们使用 ADF 范围之一 viewScope 似乎导致我们的会话大小随着时间的推移而膨胀。
视图范围的对象(例如我们的支持 Bean)由 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 方法调用的任何日志记录。
有没有人对为什么垃圾收集器在从会话中删除后可能无法回收视图范围的对象有任何想法?
提前致谢。