2016-11-13 85 views
2

这个问题特定于OmniFaces @ViewScoped bean(不过有兴趣更广泛讨论关于JSF @ViewScoped的内存泄漏和资源处理)。正是基于此NetBeans8.1测试Web应用程序可用的结果在GitHub上:JSF:Mojarra与OmniFaces @ViewScoped:@PreDestroy被调用,但bean不能被垃圾收集

Investigation of undesirable holding of references to various forms of JSF @ViewScoped beans by navigation type

https://github.com/webelcomau/JSFviewScopedNav

该测试Web应用程序有完整的说明一个全面的README,以及注解测试网页面比较过时的JSF2.0式@ManagedBean @ViewScoped,JSF2.2式CDI友好型@Named @ViewScoped和OmniFaces @Named @ViewScoped豆。

使用JVisualVM进行诊断的结果汇总在可下载的电子表格中(请参阅下面的截图),并指出虽然OmniFaces-2.5.1 @ViewScoped bean在离开视图时基于GET的导航情况下调用@PreDestroy方法(提供释放大部分资源的机会),它似乎不允许实际bean的垃圾回收(至少不会与当前上下文参数设置)。

在web.xml中的应用程序设置为使用:

com.sun.faces.numberOfViewsInSession 4 

com.sun.faces.numberOfLogicalViews 4 

默认情况下此OmniFaces特定的参数被注释掉:

org.omnifaces.VIEW_SCOPE_MANAGER_MAX_ACTIVE_VIEW_SCOPES 

的javax.faces.STATE_SAVING_METHOD默认为“服务器”。


的主要问题是:

Q1:这是正确的,这些OmniFaces @ViewScoped豆无法通过设计来收集垃圾的“活”(意指通过说使用Profiler的垃圾collectiong动作挑衅,不等待一个会话结束)?

Q2:如果是这样的话,怎么能(应该)从网页(尤其是在GET导航)导航离开其中一个最好的力释放?

Q3:如果不是这样(我的结果是因为一些其他的设置不正确的)?为什么我没看到他们的挑衅垃圾收集,我能做些什么来保证他们确实自动释放?由于测试网络应用程序是可下载的,有据可查并且希望不言自明,因此我不会在此处提供代码,而只是比较结果,以及测试网页应用程序页面的截图:

screenshots of comparitive results

screenshot of home page leading to per-bean type test cases

screenshot of JSF2.0-style case

screenshot of JSF2.2-style case

screenshot of OmniFaces case

sreenshot of post-navigation target page

+0

部分相关(只,而不是一式两份):我自己更一般的问题(不是特定于OmniFaces)如何检测和删除(在会话期间)未使用'@ViewScoped '不能被垃圾收集的bean](http://stackoverflow.com/questions/30410601/how-detect-and-remove-during-a-session-unused-viewscoped-beans-that-c​​ant-be)。和[内存影响的OmniFaces ViewScoped豆?](http://stackoverflow.com/questions/21236730/memory-implications-of-omnifaces-viewscoped-bean),但似乎不区分'@ PreDestroy'和垃圾收集。 –

回答

1

这个问题的原因似乎连接到Glassfish的/似鲭水狼牙鱼时,是由于异常行为JVisualVM。

test case used for this question仍然非常有用,但关于原始帖子(和图片)中垃圾收集的结论是基于JVisualVM的,后来我发现它们无效。

改为使用NetBeans Profiler!

现在我从NetBeans配置(1个omnifaces视图范围的bean每个打开的选项卡左)内强迫GC取得完全一致的结果OmniFaces ViewScoped与测试应用程序。

当使用连接到GlassFish /似鲭水狼牙鱼JVisualVM我得到的引用(甚至@PreDestroy称为后)仍持有com.sun.web.server.WebContainerListener类型的字段sessionListenersContainerBase$ContainerBackgroundProcessor,他们不会GC。

该图显示了附加到Payara的JVisualVM的屏幕截图,只有1个选项卡打开,但仍保留9个OmniViewBean实例,无论GC强制执行的频率如何。

Screenshot of JVisualVM attached to Payara with only 1 tab open but 9 OmniViewBean instances held


使用钻嘴鱼科-2.3.0 VS在NetBeans IDE 8 OmniFaces-2.6.6更新的结果表。2探查

Updated results table using Mojarra-2.3.0 vs OmniFaces-2.6.6 in NetBeans IDE 8.2 Profiler

更新test app序列:

home


JSF2.0 @ManagedBean @ViewScoped


JSF2.3 @Named @ViewScoped


OmniFaces 2.6.6 @ViewScoped with @Named