我正在调查内存泄漏已经有一段时间了,我无法弄明白。
基本上我的应用程序每分钟查询一次休息服务大约20次,从结果创建POJO并更新数据库。对于数据库更新,我在查询过程之后(主要)使用建议。 (我使用Spring的Resttemplate进行查询)
我知道的事实:
我的应用程序包含围绕不同接口的3个不同方面。 开始调查内存泄漏我完全禁用了方面(只是没有导入xml),一切都很顺利。
每个方面的工作是将代理对象收集的数据写入数据库。 Hibernate用作dao框架。为了确保问题不是由Hibernate引起的,我用DummyDAO替换了所有DAO,它实现了相同的接口,但实际上根本没有。
使用VisualVM进行2小时的分析得出以下结果:
显然两个版本都在稳步增加ram,所以我得出结论hibernate是而不是导致内存泄漏。
然后检查我自己的代码是否会导致内存泄漏, 但由于我只使用弹簧单身,我可以相当安全地拒绝这一点。 VisualVM显示我的所有组件只有一个实例,模型pojos也没有增长。
我的方面相当小,配置如下:
工作人员方面
<bean id="aroundWorkerAspect" class="background.aspects.AroundWorkerAspect" >
<property name="afterReturningStrategies" ref="afterReturningStrategies" />
<property name="beforeStrategies" ref="beforeStrategies" />
<property name="afterThrowingStrategies" ref="afterThrowingStrategies" />
</bean>
<aop:config>
<aop:aspect ref="aroundWorkerAspect">
<aop:pointcut id="aroundEachWorker" expression="execution(* common.worker.IWorker.executeJob(common.jobs.IJob)) and args(job)" />
<aop:around pointcut-ref ="aroundEachWorker" method = "processJob" />
</aop:aspect>
</aop:config>
处理工厂方面
<aop:aspectj-autoproxy/>
<bean id="afterProcessFactoryFillJobAspect" class="background.aspects.AfterProcessFactoryFillJobAspect" >
<property name="startStopLogDAO" ref="startStopLogDAO" />
</bean>
<aop:config>
<aop:aspect ref="afterProcessFactoryFillJobAspect">
<aop:pointcut id="getProcessAsJobList" expression="execution(* common.IProcessFactory.*(..))" />
<aop:after-returning returning="process" pointcut-ref ="getProcessAsJobList" method = "loadDataIntoEndJob" />
</aop:aspect>
</aop:config>
休息模板方面
<aop:aspectj-autoproxy/>
<bean id="afterRestTemplateUpdateMgmtSanity" class="background.aspects.AfterRestTemplateUpdateMgmtSanity" >
<property name="mgmtAppSanityDAO" ref="mgmtAppSanityDAO" />
</bean>
<aop:config>
<aop:aspect ref="afterRestTemplateUpdateMgmtSanity">
<aop:pointcut id="restTemplateExchange" expression="execution(* org.springframework.web.client.RestOperations.exchange(..))" />
<aop:after-returning returning="responseEntity" pointcut-ref ="restTemplateExchange" method = "updateMgmtAppSanity" />
</aop:aspect>
</aop:config>
分析30分钟并在开始时拍摄快照,现在给出了以下差异:
我认为内存泄漏是由错误配置而非实际错误造成的。