为什么我的ViewAccessScoped Bean没有被销毁?

时间:2015-02-22 21:21:50

标签: jsf cdi myfaces codi

我正在调查我写过的应用程序中的内存泄漏。 在对堆转储进行一些分析之后,我得到了一个奇怪的MyFaces CODI行为。

我大量使用ViewAccessScope,最近修改了我的代码,将@PostConstruct和@PreDestroy回调与相应实例的哈希码一起记录下来。

PostConstruct回调按照我的预期执行,例如来自一个完全不同的观点,没有使用豆。让我烦恼的是@PreDestroy回调永远不会被调用(即使我(我想)确保在以下视图中没有任何对bean的引用)。

这让我更加困惑的是,我编写了一个简单的小测试程序,其中包含3个视图,每个视图都由ViewAccesScoped Bean支持。当改变视图时,bean就像我期望的那样被破坏,因为我来自的bean没有在我导航到的视图的bean中的任何地方被引用。

所以我想我的问题是,除了bean引用之外还有其他因素可以考虑ViewAccessScoped bean的清理/破坏行为吗?

我在JBoss AS Final 7.1.1上使用版本1.0.5中的MyFaces CODI

1 个答案:

答案 0 :(得分:0)

我将在这里回答我自己的问题 -

有问题的bean永远不会被销毁的原因是因为它们确实共享了一个永远不会被解开的对象。它是由定制CDI便携式扩展提供的对象。

因此,CODI实际上正在按预期工作,内存泄漏不是由CODI引起的,而是由自定义CDI扩展引起的。

正如我所看到的,问题在于扩展程序提供的对象未被代理,但CDI扩展程序创建的实例在所有使用的bean之间共享。