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

oll*_*i93 5 java spring memory-leaks visualvm spring-aop

我正在调查内存泄漏已有相当长的一段时间了,我无法弄清楚。

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

我确实知道的事实:

  • VM的最大固定堆大小为350 mb(-Xmx350m)
  • Java版本1.8.0_121
  • Java运行时环境:构建1.8.0_121-b13
  • java hotspot vm 64位:内部版本25.121-b13,混合模式
  • Spring Core,Beans和Aop版本:4.3.9版本
  • AspectJ工具版本:1.5.4

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

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

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

虚拟dao的内存消耗 虚拟dao的内存消耗

实际内存消耗 实际内存消耗

显然,两个版本都在稳步增加内存,因此我得出的结论是休眠不会引起内存泄漏。

然后,我检查了自己的代码是否会导致任何地方的内存泄漏,但是由于我仅使用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分钟并在开始时进行快照,现在给出以下差异:

没有休眠 没有休眠

与休眠 在此处输入图片说明

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