我正在开发一个 Spring Boot 应用程序,它每天将文件从 SFTP 服务器复制到 S3 存储桶。代码有效,但是当我在云代工厂中运行代码时,内存和磁盘使用量增加了,这是正常的,因为大约有 1GB 的文件。问题是作业完成后,增加的内存/磁盘仍在使用。之后并没有回落。我想知道在文件复制到 S3 后我是否没有正确关闭或清除任何内容。
Vector<ChannelSftp.LsEntry> files = sftpChannel.ls("*.csv");
if (files.size() != 0) {
try {
for (ChannelSftp.LsEntry file : files) {
String fileName = file.getFilename();
InputStream inputStream = sftpChannel.get(fileName);
String newName = stamp + "_" + fileName;
final File tempFile = File.createTempFile("stream2file", "tmp");
tempFile.deleteOnExit();
try (FileOutputStream outputStream = new FileOutputStream(tempFile)) {
IOUtils.copy(inputStream, outputStream);
s3bucket.putObject(new PutObjectRequest("TEST", newName, tempFile));
inputStream.close();
outputStream.close();
outputStream.flush();
}
}
} catch (FileNotFoundException e) {
LOGGER.log(Level.INFO, "File Not Found");
} catch (IOException e) {
LOGGER.log(Level.INFO, "IO Exception");
} finally {
channel.disconnect();
LOGGER.log(Level.INFO, "Channel Disconnected");
session.disconnect();
LOGGER.log(Level.INFO, "Session Disconnected");
}
}
}
您检查以下给出的一些建议
确保关闭您打开的所有资源,而不仅仅是输入和输出流。另外,请记住在使用完 SFTPChannel 和 Session 对象后关闭它们。
将文件复制到 S3 后,不要保留对文件的任何引用。这可能会导致内存使用量增加。
使用 VisualVM 或 YourKit 等工具查找任何未正确发布的对象或资源。这些工具可以帮助识别内存泄漏。
检查在不同环境下运行应用程序时内存使用问题是否仍然存在。如果是这样,那么它可能是代码的问题。
考虑使用 Apache Commons VFS 或 Spring Integration 库来简化 SFTP 到 S3 的文件传输过程。这些库提供更高级别的抽象并更有效地处理资源管理。
希望这些对你有帮助