我正在调查内存泄漏已有相当长的一段时间了,我无法弄清楚。
基本上,我的应用程序每分钟大约查询20次休息服务,从结果中创建POJO,并更新数据库。对于数据库更新,我会在查询过程之后使用建议(主要是)。(我使用Spring的Resttemplate进行查询)
我确实知道的事实:
我的应用程序包含围绕不同接口的3个不同方面。开始调查内存泄漏时,我完全禁用了方面(只是没有导入xml),并且一切正常。
每个方面的工作都是将代理对象收集的数据写入数据库。Hibernate用作dao框架。为确保问题不是由Hibernate引起的,我将所有DAO替换为DummyDAO,它们实现了相同的接口,但实际上什么也没做。
使用VisualVM进行2个小时的分析可以得出以下结果:
显然,两个版本都在稳步增加内存,因此我得出的结论是休眠不会引起内存泄漏。
然后,我检查了自己的代码是否会导致任何地方的内存泄漏,但是由于我仅使用spring singleton,因此可以相当安全地拒绝此操作。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>
Run Code Online (Sandbox Code Playgroud)
工艺工厂方面
<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" …Run Code Online (Sandbox Code Playgroud)