Java 重新启动应用程序后发生WebSphere内存泄漏

Java 重新启动应用程序后发生WebSphere内存泄漏,java,jsf,memory-leaks,websphere,Java,Jsf,Memory Leaks,Websphere,我正在使用EclipseMat分析WAS8.5的头部转储 我在一开始提取了一个非常大的头部转储,大约700MB,我发现com.ibm.ws.webcontainer.webapp.WebAppImpl(见下图)有很多重复条目 在它下面可以找到的主要对象是我的JSF应用程序中的一个类,名为DataUtils,这个类是一个应用程序范围的Bean,其eager等于true,它在启动应用程序时运行,以便加载一些数据并将其存储在内存中 我认为这个bean的大小不应该是个问题,但是正是复制的对象造成了如

我正在使用EclipseMat分析WAS8.5的头部转储

我在一开始提取了一个非常大的头部转储,大约700MB,我发现
com.ibm.ws.webcontainer.webapp.WebAppImpl
(见下图)有很多重复条目

在它下面可以找到的主要对象是我的JSF应用程序中的一个类,名为
DataUtils
,这个类是一个应用程序范围的Bean,其eager等于true,它在启动应用程序时运行,以便加载一些数据并将其存储在内存中

我认为这个bean的大小不应该是个问题,但是正是复制的对象造成了如此巨大的内存

现在为了确定为什么我有这些重复的对象,我重新启动了服务器,然后启动了WAS和应用程序,我获取了头部转储并分析了它,一切都很好,只有一个非常小的50MB大小。(我现在知道,
DataUtils
已经初始化并加载了数据)

然后,我停止了应用程序,然后再次启动它,知道
DataUtils
将要初始化,我进行了头部转储,找到了第一个重复的
WebAppImpl
对象

您还可以注意到,标记为红色的
DataUtils
类是重复的

第二次停止-启动后,重复增加

我不确定我是否提供了足够的信息,甚至我的假设(关于
DataUtils
)是否正确。但是,应用程序范围的bean不会从内存中销毁,这是已知的吗?还有什么可能导致问题

谢谢

更多信息

安装了另一个应用程序

DataUtils
是一个应用程序范围的Bean。它注入了其他一些bean(它们同时也是Spring bean)


你有多少个网络应用?有机会看到DataUtils类吗?@NicolasFilotto请检查我在上面添加的答案。检查这个。您的bean包含静态变量。因为它已经是应用程序范围,所以应该有一个实例。因此,请尝试从所有变量中删除这些
静态变量?有机会看到DataUtils类吗?@NicolasFilotto请检查我在上面添加的答案。检查这个。您的bean包含静态变量。因为它已经是应用程序范围,所以应该有一个实例。因此,试着从所有变量中删除这些静态变量。
@ManagedBean(name = "dataUtils", eager=true)
@ApplicationScoped
public class DataUtils implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManagedProperty(value = "#{serviceFactoryExternal}")
    private ServiceFactoryExternal serviceFactoryExternal;
    public ServiceFactoryExternal getServiceFactoryExternal() {return serviceFactoryExternal;}
    public void setServiceFactoryExternal(ServiceFactoryExternal serviceFactoryExternal) {
        this.serviceFactoryExternal = serviceFactoryExternal;}

    @ManagedProperty(value = "#{serviceFactoryOperational}")
    private ServiceFactoryOperational serviceFactoryOperational;
    public ServiceFactoryOperational getServiceFactoryOperational() {return serviceFactoryOperational;}
    public void setServiceFactoryOperational(ServiceFactoryOperational serviceFactoryOperational) {
        this.serviceFactoryOperational = serviceFactoryOperational;}

    @ManagedProperty(value = "#{serviceFactoryHistorical}")
    private ServiceFactoryHistorical serviceFactoryHistorical;
    public ServiceFactoryHistorical getServiceFactoryHistorical() {return serviceFactoryHistorical;}
    public void setServiceFactoryHistorical(ServiceFactoryHistorical serviceFactoryHistorical) {
        this.serviceFactoryHistorical = serviceFactoryHistorical;}

    @ManagedProperty(value = "#{serviceFactoryLDAP}")
    private ServiceFactoryLDAP serviceFactoryLDAP;
    public ServiceFactoryLDAP getServiceFactoryLDAP() { return serviceFactoryLDAP; }
    public void setServiceFactoryLDAP(ServiceFactoryLDAP serviceFactoryLDAP) { this.serviceFactoryLDAP = serviceFactoryLDAP; }


    @PostConstruct
    public void init() {
        listCountriesEnglish = serviceFactoryOperational.getCountryService().findAll("EN");
        listCountriesFrench = serviceFactoryOperational.getCountryService().findAll("FR");
        listBanks = serviceFactoryOperational.getBankService().findAll();
        listBranches = serviceFactoryOperational.getBankService().findAllBankBankBranches();
        listJudStatusEnglish = serviceFactoryOperational.getJudStatusService().findAll("EN");
        listJudStatusFrench = serviceFactoryOperational.getJudStatusService().findAll("FR");
        listCreditPortfolioEnglish = serviceFactoryOperational.getCreditPortfolioService().findAll("EN");

//Filling lists from database....

    }
    // List of Beans
    private static List<CountryBean> listCountriesEnglish;
    private static List<CountryBean> listCountriesFrench;
    private static List<Bank> listBanks;
    private static List<BankBranchesBean> listBranches;
    private static List<odatabase.service.beans.JudStatusBean> listJudStatusEnglish;
    private static List<odatabase.service.beans.JudStatusBean> listJudStatusFrench;
    private static List<odatabase.service.beans.CreditPortfolioBean> listCreditPortfolioEnglish;
    private static List<odatabase.service.beans.CreditPortfolioBean> listCreditPortfolioFrench;
    private static List<odatabase.service.beans.ClientClassBean> listClientClassEnglish;
    private static List<odatabase.service.beans.ClientClassBean> listClientClassfrench;
    private static List<odatabase.service.beans.RegistrationCommerce> listRegCommEnglish;
    private static List<odatabase.service.beans.RegistrationCommerce> listRegCommFrench;
    private static List<LegalFormBean> listLegalFormPPEnglish;
    private static List<LegalFormBean> listLegalFormMPEnglish;
    private static List<LegalFormBean> listLegalFormPPFrench;
    private static List<LegalFormBean> listLegalFormMPFrench;

    private static List<FamStatusBean> listFamStatusEnglish;
    private static List<FamStatusBean> listFamStatusFrench;
    private static List<MohafazaBean> listMohafazaEnglish;
    private static List<MohafazaBean> listMohafazaFrench;
    private static List<KadaaBean> listKadaaEnglish;
    private static List<KadaaBean> listKadaaFrench;
    //Other Lists...

//Other simple private methods..
}
@ManagedBean(name="serviceFactoryExternal", eager=true)
@Component
@ApplicationScoped
public class ServiceFactoryExternal {

    @Autowired
    private  BcrClientService clientService;
    public void setClientService(BcrClientService clientService) { this.clientService = clientService; }
    public  BcrClientService getClientService() { return this.clientService; }

//Other Injected Spring Beans, no post construct.
}