Это мой код:
public String extractInformationAndGenerateExcel(String username, List comuniList, String uniqueFileName) throws IOException {
Path tempFilePath = Files.createTempFile("temp_", ".txt");
try (Stream contrattiEAttrezzatureStream = contrattiAttrezzatureRepository.getReportContrattiAttrezzature(username, comuniList);
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedWriter writer = Files.newBufferedWriter(tempFilePath, StandardOpenOption.WRITE)
)
{
logger.info("Start to write file??????");
contrattiEAttrezzatureStream.forEach(contratto -> {
try {
writer.write(contratto.toString());
writer.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
});
logger.info("Finish");
return "Finish?";
}catch (Exception e) {
throw new RuntimeException(e);
}finally {
if (tempFilePath != null && Files.exists(tempFilePath)) {
try {
Files.delete(tempFilePath);
} catch (IOException e) {
logger.error("Error", e);
}
}
}
}
Однако использование памяти продолжает расти. Я использую следующие настройки JVM: -Xmx2g -XX:+UseSerialGC. Как видите, оперативная память ограничена 2ГБ и я не могу ее увеличить. Мой драйвер — jdbc.SQLServerDriver, и я использую SQLServer2019Dialect с Java 1.8
Моя ситуация с использованием VisualVM такова

Вот изображение профиля потока моего Java-приложения, показывающее время выполнения и состояние различных потоков:

Вопросы:
- Правильно ли использование Stream?
- Правильно ли есть что-то, что я не рассматриваю?
Мне грустно видите, что Stackoverflow закрыл для меня вопрос, хотя я его отредактировал.
Тем не менее, я хотел бы предложить найденное решение, чтобы оно могло помочь любому, у кого такая же проблема, как у меня.
После долго искал и нашел этот ответ о менеджере сущности транзакции. По сути, менеджер сущностей сохраняет все ссылки в памяти и предлагает «очистить» их с помощью очистки.
Это мой код, дополненный примером
@Autowired
private EntityManager entityManager; //
Подробнее здесь: https://stackoverflow.com/questions/790 ... ta-streams