InputStream, OutputStream 可能内存泄漏? [关闭]

问题描述 投票:0回答:1

我正在开发一个 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");
            }
    }
}
java memory-leaks
1个回答
0
投票

您检查以下给出的一些建议

  1. 确保关闭您打开的所有资源,而不仅仅是输入和输出流。另外,请记住在使用完 SFTPChannel 和 Session 对象后关闭它们。

  2. 将文件复制到 S3 后,不要保留对文件的任何引用。这可能会导致内存使用量增加。

  3. 使用 VisualVM 或 YourKit 等工具查找任何未正确发布的对象或资源。这些工具可以帮助识别内存泄漏。

  4. 检查在不同环境下运行应用程序时内存使用问题是否仍然存在。如果是这样,那么它可能是代码的问题。

  5. 考虑使用 Apache Commons VFS 或 Spring Integration 库来简化 SFTP 到 S3 的文件传输过程。这些库提供更高级别的抽象并更有效地处理资源管理。

希望这些对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.