簡體   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