Memory leak using while uploading and downloading a file (may be because of using ChannelSftp.get( “file_name”) )?

耗尽温柔 提交于 2019-12-01 11:58:55

问题


Can you please tell the internal working of ChannelSftp.get( "file_name")? Will the use of this function to get a single file from a list of files (600 files of 10 kb) can cause memory leakage issues in Tomcat8, if this function is used frequently?

This is the code which is used for uploading and fetching files from remote server.

public String connectRemote(String host, String user, String password, String 
    remotePath, String sFileName) throws IOException, JSchException, SftpException 
{
    try {
        String sFileNames ="";
        Session session = connectSFTP(host, user, password);

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp chan = (ChannelSftp) channel;

        try {

            String ftpRemoteDirectory = "/Irismedical/Outbox_Eligibility";

            chan.cd(ftpRemoteDirectory);

            File ftest = new File(sFileName);

            chan.put(new FileInputStream(ftest), ftest.getName());

            sFileNames =  ftest.getName();

        }
        catch (Exception e) {
            chan.disconnect();
            session.disconnect();
            return null;
        }

        chan.cd("/Irismedical/Inbox/Eligibility");

        String sRes = null;
        for (int i = 0;i<6 ; i++) {

            try {
                  sRes = convertInputStreamToString(
                             chan.get(sFileNames+"_Response_271_1.edi"));

                 if (sRes  != null ) {

                     break;

            } catch (Exception e ) {
                if (i<3) {
                    Thread.sleep(3000);
                } else {
                    Thread.sleep(5000);
                }
            }
        }
                    session.disconnect();

        return sRes;
    }
    catch (Exception e) {
        }
        return null;
    }
}

private static String convertInputStreamToString(InputStream inputStream) 
    throws IOException {

    ByteArrayOutputStream result = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        result.write(buffer, 0, length);
    }

    return result.toString(StandardCharsets.UTF_8.name());
}

回答1:


You have to dispose the streams.

Both the FileInputStream in your upload code and the InputStream returned by ChannelSftp.get in your download code.

See Disposing streams in Java.



来源:https://stackoverflow.com/questions/58055995/memory-leak-using-while-uploading-and-downloading-a-file-may-be-because-of-usin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!