小编ste*_*ide的帖子

CDI会话范围bean未被破坏导致内存泄漏

我对会话作用域CDI bean的生命周期有疑问.
据我所知,会话范围内的CDI bean是在会话开始时由容器构造的,并在会话结束时销毁.在销毁bean之前,调用@PreDestroy方法,如https://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html所述.它还说要在这种方法中释放资源.

在我构建的JSF应用程序中,我遇到内存泄漏,因为bean似乎没有被销毁,因此不会调用@PreDestroy方法来释放垃圾收集器的一些引用.所以我构建了一个简单的应用程序来测试行为.我的经验是会话bean在会话结束时不会被破坏,而且当需要内存空间时它甚至不会被破坏.我不敢相信我是第一个遇到这种情况的人,但我没有找到任何有关此行为的信息.

所以我的问题是:在上下文过期之后,不应该销毁CDI bean - 因此调用@PreDestroy方法吗?如果不是,在需要空间时,它至少应该被破坏吗?

我的测试应用:

我不允许发布图片,但大纲是eclipse生成的非常基本的jsf webapp.我也有beans.xml文件.

Test.java:

package com.test;

import java.io.Serializable;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@SessionScoped
@Named
public class Test implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String test;
    private ArrayList<ComplexType> cps;
    private ArrayList<ComplexType> cps_2;

    @PostConstruct
    public void init() {
        System.out.println("test postconstruct..");
        test = "Cdi Test";
    }

    @PreDestroy
    public void cleanUp() {
        cps …
Run Code Online (Sandbox Code Playgroud)

jsf session-scope destroy cdi weld

5
推荐指数
2
解决办法
2889
查看次数

标签 统计

cdi ×1

destroy ×1

jsf ×1

session-scope ×1

weld ×1