这个问题特定于OmniFaces @ViewScoped bean(不过有兴趣更广泛讨论关于JSF @ViewScoped的内存泄漏和资源处理)。正是基于此NetBeans8.1测试Web应用程序可用的结果在GitHub上:JSF:Mojarra与OmniFaces @ViewScoped:@PreDestroy被调用,但bean不能被垃圾收集
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:如果不是这样(我的结果是因为一些其他的设置不正确的)?为什么我没看到他们的挑衅垃圾收集,我能做些什么来保证他们确实自动释放?由于测试网络应用程序是可下载的,有据可查并且希望不言自明,因此我不会在此处提供代码,而只是比较结果,以及测试网页应用程序页面的截图:
部分相关(只,而不是一式两份):我自己更一般的问题(不是特定于OmniFaces)如何检测和删除(在会话期间)未使用'@ViewScoped '不能被垃圾收集的bean](http://stackoverflow.com/questions/30410601/how-detect-and-remove-during-a-session-unused-viewscoped-beans-that-cant-be)。和[内存影响的OmniFaces ViewScoped豆?](http://stackoverflow.com/questions/21236730/memory-implications-of-omnifaces-viewscoped-bean),但似乎不区分'@ PreDestroy'和垃圾收集。 –