我们有一个弹簧批处理作业,负责将测试场景从平面文件加载到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倍,增加到5g!
通过连接Yourkit分析器,我能够检测到存储在上下文中的StepExecution使用了大量内存(并且每次循环后都会增加)。
如何在每个步骤后禁用保存StepExecution的功能?我不需要它,因为我的工作不可重启。
如果您有任何其他想法可以解决我的问题,我也很感兴趣。
非常感谢你的帮助。