0

我目前正在调查我编写的应用程序中的内存泄漏。在对堆转储进行一些分析后,我发现我将注意力集中在 MyFaces CODI 的奇怪行为上。

我大量使用 ViewAccessScope 并最近修改了我的代码以记录 @PostConstruct 和 @PreDestroy 回调以及相应实例的哈希码。

PostConstruct 回调按照我的预期执行,例如,当来自一个完全不同的视图时,它没有使用 bean。让我烦恼的是,从未调用过 @PreDestroy 回调(即使我(我认为我)确保在以下视图中的任何地方都没有对 bean 的引用)。

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

所以我想我的问题是,关于 ViewAccessScoped bean 的清理/销毁行为,除了 bean 引用之外还有其他因素需要考虑吗?

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

4

1 回答 1

0

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

所讨论的 bean 永远不会被销毁的原因是因为它们确实共享一个永远不会被取消作用域的对象。它是由自定义 CDI 可移植扩展提供的对象。

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

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

于 2015-02-22T23:57:21.457 回答