繁体   English   中英

使用org.apache.commons.io.FileUtils时Android内存泄漏

[英]Android memory leak when using org.apache.commons.io.FileUtils

我正在尝试将SD卡上的所有图像文件(连接到运行4.0.4的有根Android设备)复制到连接到同一设备的硬盘上。 我是Android编程的新手,如果问题的答案很明显,请原谅我。

我使用以下方法,从服务的onHandleIntent(Intent intent)调用到复制:

private void copyImages(File sourceDirectory, File destinationDirectory) throws IOException {
    int count = 0;
    IOFileFilter imageFilter = new ImageFilter();
    IOFileFilter visibleDirectoryFilter = new VisibleDirectoryFilter();

    long startTime = System.nanoTime();
    if (sourceDirectory.exists() && destinationDirectory.exists()) {
        Collection<File> fileList = FileUtils.listFiles(sourceDirectory, imageFilter, visibleDirectoryFilter);
        for (File image : fileList) {               
            FileUtils.copyFileToDirectory(image, destinationDirectory);
            count++;
        }
    }

    long totalTime = System.nanoTime() - startTime;
    Toast.makeText(this, count + " files copied in " + (totalTime) + " nanos.", Toast.LENGTH_LONG).show();
}

但是,当我运行此命令时,在复制36张图像后,我开始不断获得GC_CONCURRENT freed aK, b% free cK/dK, paused ems+fms ,其中abcdef是不同的数字。 我长时间(只要等了)就一直不停地复制其他图像。

我了解(无论如何我都认为),这是因为堆已满,而Dalvik试图释放内存。 但是,我不确定如何阻止这种情况的发生,该程序应该能够复制更多(可能是数千个)图像。 也许apache commons FileUtils类对于Android来说太重了,在这种情况下,是否还有另一个Android友好的库用于整洁的文件处理,还是我必须编写自己的简单库? 也许我在其他地方出错了。

任何帮助深表感谢。

提前致谢。

这是最不可能的。 GC是应用程序处理的正常部分。 实际上,我敢打赌,如果您的应用程序正忙于执行缓慢的IO,那么系统现在就决定进行清理的好时机。

当然,FileUtils的源是开放的。 它不是特别可怕:

http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/FileUtils.java#FileUtils.doCopyFile%28java.io.File% 2Cjava.io.File%2Cboolean%29

唯一可以说是“过大”的事情是创建复制缓冲区。 默认值为4K: http : //grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/IOUtils.java#IOUtils.copyLarge%28java。 io.InputStream%2Cjava.io.OutputStream%29

除非您可以将实际问题隔离到该代码中,否则我不会对此太担心。

从性能角度来看,您可能想测试BufferedInputStream / OutputStream是否在此提供了任何优势。 有问题,因为IOUtils复制方法也使用缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM