Java 释放多个步骤上使用的地图内存空间

Java 释放多个步骤上使用的地图内存空间,java,collections,spring-batch,Java,Collections,Spring Batch,我使用SpringBatch进行多个步骤,当我们继续执行时,我看到内存占用增加了,因为我使用映射结构存储从多个csv文件读取的数据。我正在使用这些数据来dodo一些转换记录 所以我的问题是什么是释放内存占用的最合适的方法 @Bean public Job importParameterJob() { return jobBuilderFactory.get("importParameterJob") .incrementer(new Ru

我使用SpringBatch进行多个步骤,当我们继续执行时,我看到内存占用增加了,因为我使用映射结构存储从多个csv文件读取的数据。我正在使用这些数据来dodo一些转换记录

所以我的问题是什么是释放内存占用的最合适的方法

@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步开始,我没有参考这个映射,我可以/应该删除这个映射。这就是为什么我想到Tasklet5
    step5
    implements
    StepExecutionListener
    或-better-
    beforeStep()
    Thak you Very@Lucafirst我想感谢您的友好帮助和合作。由于我使用地图存储从第一步读取的所有记录,正如我前面提到的,该地图将在第二步和第三步中使用,然后从第四步开始就不需要使用它,因此我认为您的方法在这里是不可接受的:录制到第1步他的方法不适用,因为我总是在几个步骤上参考这个列表。记录到2这个方法有一个额外的成本,在每一步我都会重新创建地图并多次销毁它。如果你需要在多个步骤中存储地图,你需要使用侦听器来创建和清理它。是的,我确认为@Luca Basso Ricci评论,再次感谢您您可能希望更新您的原始问题以使其更清楚。它没有说明地图必须在多个步骤中使用。
    @Autowired
        private Step2ItemProcessor listObject;