我在请求范围中定义了我的JSF Handler,如下所示
public class JsfHandler {
private List<ManagedBean> managedBeanList; // managed bean List in session scope
}
<managed-bean>
<managed-bean-name>jsfHandler</managed-bean-name>
<managed-bean-class>com.test.JsfHandler</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>managedBeanList</property-name>
<value>#{managedBeanList}</value>
</managed-property>
</managed-bean>
我在JSF中有一个会话范围的JSF托管bean列表,定义如下。
<managed-bean>
<managed-bean-name>managedBeanList</managed-bean-name>
<managed-bean-class>java.util.ArrayList</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
方法1:
managedBeanList.clear();
managedBeanList.addAll(service.getResultList());
// assuming service.getResultList() would return a new ArrayList();
方法2:
managedBeanList = service.getResultList();
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("managedBeanList",managedBeanList);
我们目前正在使用方法1.
方法2是否正确?在appraoch 2中调用Java Garabage收集器时,在内存使用方面是否有任何优势。
答案 0 :(得分:1)
两者都不正确。该列表必须是会话作用域托管bean的属性。您应该尽可能避免手动摆弄会话地图。
这两者中没有一个比另一个更“GC友好”。在方法1中,您最终会在service.getResultList()
返回的列表中找到未引用的实例。在方法2中,您最终得到了一个未引用的列表实例,该实例之前由managedBeanList
引用。在这两种情况下,GC都必须完成相同的工作:清理未引用的实例。