Java 重新启动应用程序后发生WebSphere内存泄漏
我正在使用EclipseMat分析WAS8.5的头部转储 我在一开始提取了一个非常大的头部转储,大约700MB,我发现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的大小不应该是个问题,但是正是复制的对象造成了如
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.
}