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

时间:2012-12-03 01:20:51

标签: java android dalvik

我正在尝试将SD卡上的所有图像文件(连接到运行4.0.4的root设备)连接到连接到同一设备的硬盘驱动器。我是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公共文件FileUtils类对于Android来说太重了,在这种情况下是否有另一个Android友好的文件库来处理整洁的文件或者我必须编写自己的简单库?或者也许我在其他地方出错了。

非常感谢任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:-1)

这很可能是一个非问题。 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复制方法也使用缓冲区。