Java 释放多个步骤上使用的地图内存空间
我使用SpringBatch进行多个步骤,当我们继续执行时,我看到内存占用增加了,因为我使用映射结构存储从多个csv文件读取的数据。我正在使用这些数据来dodo一些转换记录 所以我的问题是什么是释放内存占用的最合适的方法Java 释放多个步骤上使用的地图内存空间,java,collections,spring-batch,Java,Collections,Spring Batch,我使用SpringBatch进行多个步骤,当我们继续执行时,我看到内存占用增加了,因为我使用映射结构存储从多个csv文件读取的数据。我正在使用这些数据来dodo一些转换记录 所以我的问题是什么是释放内存占用的最合适的方法 @Bean public Job importParameterJob() { return jobBuilderFactory.get("importParameterJob") .incrementer(new Ru
@Bean
public Job importParameterJob() {
return jobBuilderFactory.get("importParameterJob")
.incrementer(new RunIdIncrementer())
.start((step1()))
.next((step2))
.next((step3))
.next((step4))
.next((step5))
.next(finalStep())
.build();
}
让我们举一个例子,我的第2步是使用一个列表将所有记录从csv文件存储到地图(列表),更准确地说,第2步的项目处理器将所有记录存储在地图列表上
public class Step2ItemProcessor implements ItemProcessor<Step2FileRow, Step2FileRow> {
private static final Logger log = LoggerFactory.getLogger(Step2ItemProcessor.class);
private Map<Long , Step2FileRow> step2FileRowMap;
public Step2ItemProcessor() {
step2FileRowMap = new HashMap<Long , Step2FileRow>();
log.info("Step2 ItemProcessor a été crée avec une Map pour charger tous les Step2s");
}
@Override
public Step2FileRow process(final Step2FileRow Step2FileRow) throws Exception {
step2FileRowMap.put(Step2FileRow.getId(), Step2FileRow);
log.info("Le Step2 ID :" + Step2FileRow.getId() +" a été ajouté dans la liste des Step2s en memoire Map");
return null;
}
public Map<Long , Step2FileRow> getstep2FileRowMap() {
return step2FileRowMap;
}
}
有两个选项可供选择:
ItemStream
接口-该ItemStream
接口旨在由任何有状态的Spring批处理组件实现。它提供了框架调用的三种方法:
-在数据处理开始之前调用此方法,以允许组件打开任何必需的资源并重置以前运行中存储的任何状态ItemStream#open(ExecutionContext)
-通过执行一个步骤定期调用此方法,允许组件在发生故障时保存任何状态ItemStream#update(ExecutionContext)
-此方法用于在处理完成后清理任何资源ItemStream#close()
ItemStream
选项中,您将在ItemStream#open
中重新初始化每个Map
,并可能在ItemStream#close
中清理它
您可以在此处阅读有关步骤作用域组件的更多信息:
您可以在此处阅读有关
ItemStream
界面的更多信息:让Step2ItemProcessor
在afterJob()中实现JobExecutionListener
和clear()
您的地图,谢谢您的帮助。我不能,因为我还在第3步和第4步使用地图(正如我提到的,映射存储了一些我在执行某些东西时需要参考的记录),事实上,从第5步开始,我没有参考这个映射,我可以/应该删除这个映射。这就是为什么我想到Tasklet5step5
implementsStepExecutionListener
或-better-beforeStep()
Thak you Very@Lucafirst我想感谢您的友好帮助和合作。由于我使用地图存储从第一步读取的所有记录,正如我前面提到的,该地图将在第二步和第三步中使用,然后从第四步开始就不需要使用它,因此我认为您的方法在这里是不可接受的:录制到第1步他的方法不适用,因为我总是在几个步骤上参考这个列表。记录到2这个方法有一个额外的成本,在每一步我都会重新创建地图并多次销毁它。如果你需要在多个步骤中存储地图,你需要使用侦听器来创建和清理它。是的,我确认为@Luca Basso Ricci评论,再次感谢您您可能希望更新您的原始问题以使其更清楚。它没有说明地图必须在多个步骤中使用。
@Autowired
private Step2ItemProcessor listObject;