gpt4 book ai didi

java - Spring Batch 在处理每个批处理后是否释放堆内存?

转载 作者:行者123 更新时间:2023-12-01 19:02:21 24 4
gpt4 key购买 nike

我有一个 Spring 批处理作业,其中仅包含一个步骤,即使用 FlatFileItemReader 读取 CSV 文件(包含大约 2000 行)并将对象写入数据库。我有自己的自定义 BeanWrapperFieldSetMapper ,它将行映射到对象。 block 大小设置为 50,因此我期望在写入每个批处理(50 个对象)中的对象后,将释放这些对象的堆内存。

由于我正在利用批处理,因此我预计在每个给定时间只有 50 个 CreditCardDebt 对象。但相反,在处理最后一批时,我发现堆内存包含 2000 个 CreditCardDebt 对象。

我错过了什么?

我的 BeanWrapperFieldSetMapper 实现:

@Component("CREDIT_CARD_DEBT_FIELD_SET_MAPPER_TEST")
public class TestDebtFieldSetMapper extends BeanWrapperFieldSetMapper<CreditCardDebt> {

public TestDebtFieldSetMapper() {
super.setPrototypeBeanName("CREDIT_CARD_DEBT_FIELD_SET_MAPPER_TEST");
}

@NonNull
@Override
public CreditCardDebt mapFieldSet(FieldSet fieldSet) {
CreditCardDebt creditCardDebt = new CreditCardDebt();
creditCardDebt.setAccount(fieldSet.readString(0));
creditCardDebt.setCardholderId(fieldSet.readString(1));
creditCardDebt.setDueDate(convertToLocalDateViaInstant(fieldSet.readString(2)));
creditCardDebt.setDaysPastDue(fieldSet.readInt(3));
creditCardDebt.setOverdueAmount(fieldSet.readDouble(4));
creditCardDebt.setDirectDebitMinimumPayment(fieldSet.readDouble(5));
creditCardDebt.setDirectDebitBalance(fieldSet.readDouble(6));
creditCardDebt.setDirectDebitStatus(fieldSet.readChar(7));
creditCardDebt.setDirectDebitType(DirectDebitType.valueOf(fieldSet.readString(8)));
creditCardDebt.setCreatedDate(LocalDateTime.now());
creditCardDebt.setFileName("BAL");
return creditCardDebt;
}

private LocalDate convertToLocalDateViaInstant(String dateToConvert) {
DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyyMMdd");
return LocalDate.parse(dateToConvert, formatters);
}

最佳答案

这是留给垃圾收集器的。与此问题相关的相关代码部分位于 ChunkOrientedTasklet 。在最基本的 ChunkOrientedTasklet 形式中,有两个调用:

Chunk<I> inputs = chunkProvider.provide(contribution);
chunkProcessor.process(contribution, inputs);

ChunkProvider 使用 ItemReader 读取 commit-interval 项(或者如果项读取器返回 null 则更少) >)。 ChunkProcessor 使用 ItemProcessorItemWriter 来处理和写入项目:

Chunk<O> outputs = transform(contribution, inputs);
write(contribution, outputs); // details of adjustments of output omitted here

此过程会重复运行,直到数据源耗尽。因此,当 GC 启动时,处理过的 block 的项目应该被垃圾收集(因为变量 inputs/outputs 被重新使用),除非在整个作业期间有东西将它们保存在内存中执行。

关于java - Spring Batch 在处理每个批处理后是否释放堆内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59616431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com