gpt4 book ai didi

java - 了解 Java 中由容器管理的对象的垃圾回收

转载 作者:搜寻专家 更新时间:2023-11-01 01:54:22 26 4
gpt4 key购买 nike

假设我有一个名为 A 的托管 bean,它是 @RequestScoped 假设 A 引用了另一个托管 bean BB 被声明为 @SessionScopedA 引用另一个具有更长作用域的 bean 是否会阻止 AHttpRequest 结束时收集垃圾?

如果 B 包含对 A 的引用,情况是否会反过来?如果是,那为什么?

最佳答案

Will the fact that A has a reference to another bean with longer scope prevent A from getting garbage collected at the end of the HttpRequest?

不,对象实例只有在不再有对它的引用时才有资格进行 GC。

默认情况下,请求范围的 bean 仅在当前 HTTP 请求中引用(作为 request attribute )。因此,如果 HTTP 请求完成并被销毁,则请求作用域的 bean 将完全取消引用,从而有资格进行 GC。请求作用域 bean 又包含对 session 作用域 bean 的引用与 GC 完全无关。只有当 session 范围的 bean 没有在任何地方被引用时(例如,当 session 过期时), session 范围的 bean 才有资格进行 GC。


Will the situation change the other way around ie if B contains a reference to A? if yes then why ?

是的,它会改变。默认情况下, session 范围的 bean 仅在 HTTP session 中引用(作为 session attribute ),它的生命周期比 HTTP 请求长。因此,请求范围的 bean 将与已建立的 HTTP session 一样长。这将导致潜在的数据完整性问题,因为您引用的东西应该不会存在那么久。这就是为什么 JSF 不允许您通过 @ManagedProperty 在范围更广的 bean 中注入(inject)范围更窄的 bean 的原因之一。

总而言之,不应根据 GC 行为来选择托管 bean 范围,而应根据它持有的数据来选择。另见 How to choose the right bean scope?

关于java - 了解 Java 中由容器管理的对象的垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com