Spring AOP内存泄漏 - 配置错误?

时间:2017-08-07 11:13:33

标签: java spring memory-leaks spring-aop visualvm

我正在调查内存泄漏已经有一段时间了,我无法弄明白。

基本上我的应用程序每分钟查询一次休息服务大约20次,从结果创建POJO并更新数据库。对于数据库更新,我在查询过程之后(主要)使用建议。 (我使用Spring的Resttemplate进行查询)

我知道的事实:

  • VM的最大固定堆大小为350 mb(-Xmx350m)
  • java version 1.8.0_121
  • java runtime env:build 1.8.0_121-b13
  • java hotspot vm 64 bit:build 25.121-b13,mix mode
  • Spring Core,Beans& Aop版本:4.3.9发布
  • AspectJ工具版本:1.5.4

我的应用程序包含围绕不同接口的3个不同方面。 开始调查内存泄漏我完全禁用了方面(只是没有导入xml),一切都很顺利。

每个方面的工作是将代理对象收集的数据写入数据库。 Hibernate用作dao框架。为了确保问题不是由Hibernate引起的,我用DummyDAO替换了所有DAO,它实现了相同的接口,但实际上根本没有。

使用VisualVM进行2小时的分析得出以下结果:

使用虚拟daos的内存消耗 Memory consumption with dummy daos

实际操作的内存消耗 Memory consumption with actual daos

显然两个版本都在稳步增加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分钟并在开始时拍摄快照,现在给出了以下差异:

没有Hibernate Without Hibernate

使用Hibernate enter image description here

我认为内存泄漏是由错误配置而非实际错误造成的。

0 个答案:

没有答案