oll*_*i93 5 java spring memory-leaks visualvm spring-aop
我正在调查内存泄漏已有相当长的一段时间了,我无法弄清楚。
基本上,我的应用程序每分钟大约查询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" expression="execution(* common.IProcessFactory.*(..))" />
<aop:after-returning returning="process" pointcut-ref ="getProcessAsJobList" method = "loadDataIntoEndJob" />
</aop:aspect>
</aop:config>
Run Code Online (Sandbox Code Playgroud)
休息模板方面
<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>
Run Code Online (Sandbox Code Playgroud)
分析30分钟并在开始时进行快照,现在给出以下差异:
我认为内存泄漏是由于配置错误而不是实际的错误造成的。
| 归档时间: |
|
| 查看次数: |
546 次 |
| 最近记录: |