Java SSH递归下载导致内存泄漏
我正在使用提供一个实用程序,为我的公司备份整个服务器数据 该应用程序是使用Java SSH递归下载导致内存泄漏,java,recursion,memory-management,ssh,memory-leaks,Java,Recursion,Memory Management,Ssh,Memory Leaks,我正在使用提供一个实用程序,为我的公司备份整个服务器数据 该应用程序是使用Java8和JavaFX2 我的问题是,我认为我的递归下载是错误的,因为我的程序RAM使用量在以秒为单位增长,而且似乎从未释放出来 这是我执行的操作顺序: 连接到远程服务器:正常 选择SFT频道->会话。openChannel(“sftp”):确定 正在检索本地目录->sftpChannel.cd(主目录):确定 列出目录内容->final Vector entries=sftpChannel.ls(“.”) 调用递归方法
Java8
和JavaFX2
我的问题是,我认为我的递归下载是错误的,因为我的程序RAM使用量在以秒为单位增长,而且似乎从未释放出来
这是我执行的操作顺序:
会话。openChannel(“sftp”)
:确定sftpChannel.cd(主目录)
:确定final Vector entries=sftpChannel.ls(“.”)代码>
->调用递归方法if(entry.getAttrs().isDir())
- else->这是一个文件,没有更多的子文件夹可供访问李>
- 进程下载
sftprogressmonitor()
是一个提供进度监控的界面,我使用它来更新UI(progressbar)。此接口从不在内部引用inputstream,只是为了说明这一点。但它仍然是一个非静态匿名类,因此它确实持有对DownloadMethod作用域的引用
is.close(); //the inputstream from sftChannel.get()
bos.close(); //the FileOutputStream
正如你所理解的,我递归地处理这些操作,意思是:
- 如果是目录,请进入目录,然后执行1。
- 这是一个文件,下载它
FileOutputStream
本身:
final BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileToSave));
sftpChannel.get(remoteFilePath, bos, new SftpProgressMonitor()
在sftprogressmonitor.end()
I close->bos.close()
中
没有任何变化
我还尝试列出所有文件,仍然是递归的,将它们各自的字节长度添加到专用长totalBytesToDownload
中,我的程序内存保持非常稳定:在整个过程中只占用了20Mb(因为totalBytesToDownload不断增加)这证实了我的下载方法确实有问题
如果我确实关闭了流,为什么GC不会收集它们?这将在指向层次结构的符号链接或硬链接上消失。要么使用
rsync
要么建立一个你复制的东西的集合,并感谢你@LevKuznetsov指出这一点,但在我的例子中,我忽略了所有符号链接。你所说的rscync
是什么意思?rsync
是一个Linux实用程序,它完全可以完成你正在做的事情。谷歌。即使您关闭了软链接,也无法判断您是否正在查看硬链接。@LevKuznetsov服务器正在运行Windows server,而我在Jsch中没有看到这样的方法:/可能是重复的
final BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileToSave));
sftpChannel.get(remoteFilePath, bos, new SftpProgressMonitor()