当前位置: 首页 > 面试题库 >

在上载和下载文件时使用了内存泄漏(可能是由于使用ChannelSftp.get(“ file_name”))?

郎同化
2023-03-14
问题内容

你能告诉我内部工作ChannelSftp.get( "file_name")吗?如果频繁使用此功能,从文件列表(600个10
kb的文件)中获取单个文件是否会导致Tomcat8中的内存泄漏问题?

这是用于从远程服务器上载和获取文件的代码。

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());
}

问题答案:

您必须处置流。

无论是FileInputStream上传代码和InputStream返回通过ChannelSftp.get在下载代码。

请参阅使用Java处置流。



 类似资料:
  • 我正在启用持久性的Kubernetes集群中运行Ignite。每台机器都有一个24GB的Java堆,20GB专用于持久内存,内存限制为110GB。我的相关JVM选项是。在每个节点上运行DataStreamer数小时后,我的集群上的节点达到了它们的k8s内存限制,触发了OOM杀机。运行Java NMT后,我惊讶地发现分配给内部内存的空间数量巨大。 Kubernetes metrics证实了这一点:

  • 我试图将Ignite用作键值对的内存数据库,其值范围从50MB到800MB不等。看起来Ignite通过JVM分配堆空间,它从不清理,即使缓存条目离开堆,被清除,没有连接的客户机和运行的操作。我的机器将无法处理这样的内存消耗,因此我正在寻找一种方法来清理一些内存。 我的测试场景如下: null 我正在使用pyignite瘦客户机,通过python脚本在本地测试Ignite: 该脚本将800 MB的数

  • 我正在编写一个spring boot 2应用程序,我正在使用SQL批量复制功能在SQL Server2012数据库中插入几条记录。每插入700行,我就有600 MB的泄漏 我已经试用了Microsoft驱动程序版本6.4.0.jre8和7.2.2.jre8,但任何东西都改变了。我尝试为tomcat更改Hikari连接池,但结果是一样的。 为了调用Microsoft API,我使用了包装器框架(ht

  • 我有一个Java应用程序,它合并了一些大文件。Java应用程序不在我的控制之下。Java应用程序的结果以大约90MB的大字符串返回给我的C程序,我在其中的一些算法中使用它。我多次调用execute方法。我的问题是,每次调用Java应用程序时,它都会保留更多内存,但不会释放内存。从这个垃圾收集和JNI调用问题中,我想到手动调用垃圾收集器,但它不会释放内存。有没有办法解决这个问题? 这是我的C程序

  • 今天给大家聊聊咱们平时写代码的时候,最常见的String字符串代码,它的一些底层原理,以及使用不当可能引发的内存泄漏的问题,相信对于大家平时日常开发写代码会有一定的帮助。 String字符串在内存里是如何存储的? 首先呢,当我们平时在代码中写下一行String类型的代码时,大家知道这个String字符串在内存里是如何存储的吗?比如这样的一行代码:String username = “zhangsa

  • 问题内容: 由于这是我第一次学习系统编程,因此我很难将规则束之高阁。现在,我对内存泄漏感到困惑。让我们考虑一个例子。说,Rust正在抛出一个Python将会捕获的指针(指向字符串)。 在Rust中,(我只是发送的指针) 在Python中,(我取消引用了指针) 现在,我的问题是释放内存。我认为应该在Python中将其释放,但随后所有权会突然增加。因为,似乎采用了不可变的参考。因此,我对于是否应该在R