Java Spring批处理内存泄漏

Java Spring批处理内存泄漏,java,spring,memory-leaks,spring-batch,Java,Spring,Memory Leaks,Spring Batch,我们有一个spring批处理作业,负责将测试场景从平面文件加载到DB中,运行我们想要测试的程序,验证其结果 我们检查了程序执行的许多场景(~300),因此我们加载了精确的场景,启动程序并验证其结果~300次 这项工作的实施如下: <job id="jobXY" xmlns="http://www.springframework.org/schema/batch"> <step id="loadFlatFileToDb" next="loadTestScenario"&g

我们有一个spring批处理作业,负责将测试场景从平面文件加载到DB中,运行我们想要测试的程序,验证其结果

我们检查了程序执行的许多场景(~300),因此我们加载了精确的场景,启动程序并验证其结果~300次

这项工作的实施如下:

<job id="jobXY" xmlns="http://www.springframework.org/schema/batch">
    <step id="loadFlatFileToDb" next="loadTestScenario">
        <tasklet>
            <chunk reader="flatFileReader" writer="flatFileWriter" commit-interval="2500"/>
        </tasklet>
    </step>

    <step id="loadTestScenario" next="launchProgram">
        <tasklet ref="loadTestScenario"/>
    </step>

    <step id="launchProgram" next="verifyResults">
        <tasklet ref="launchProgramTasklet"/>
    </step>

    <step id="verifyResults" next="endTest">
        <tasklet ref="verifieAvisTasklet"/>
    </step>

    <decision id="endTest" decider="endTestDecider">
        <next on="FALSE" to="loadTestScenario" />
        <end on="TRUE"/>
    </decision>
</job>

我们将最后4个步骤循环300次。从内存消耗的角度来看,这些步骤真的很简单。此外,测试的程序在另一个JVM中启动。所以它不应该影响这个程序的内存

但是,该程序占用的内存会随着时间的推移而增加。执行约150次后,使用的内存(开始时:~100mo)将增加5倍,并增加到5go

通过连接Yourkit profiler,我能够检测到存储在上下文中的StepExecution使用了大量内存(每次循环后内存都会增加)

如何禁用在每个步骤后保存步骤执行的功能?我不需要它,因为我的工作无法重启

如果你有任何其他的想法可以解决我的问题,我也很感兴趣


非常感谢您的帮助。

您怎么能说内存泄漏?你试过调整你的JVM配置吗?我这么说是因为根据程序的功能,没有理由需要5go。此外,只要它运行,所使用的内存就会增加。我经常以“超出outofmemoryerror gc开销限制”错误告终。当我将可用内存扩展到JVM时,它可以工作,但这不是一个好的解决方案?也许你在阻止GC删除你的组件创建的对象?我已经分析了代码,我不觉得我自己的代码不能释放对象(当然我可能是错的)。但是,使用Yourkit进行分析可以证明,最大的对象是spring在上下文中存储的StepExecution。当内存不足时,创建jvm的转储,并查看哪些对象正在使用最大内存。