[英]How to improve org.apache.commons.io.FileUtils copyInputStreamToFile in Servlet
[英]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
,其中a
, b
, c
, d
, e
和f
是不同的數字。 我長時間(只要等了)就一直不停地復制其他圖像。
我了解(無論如何我都認為),這是因為堆已滿,而Dalvik試圖釋放內存。 但是,我不確定如何阻止這種情況的發生,該程序應該能夠復制更多(可能是數千個)圖像。 也許apache commons FileUtils類對於Android來說太重了,在這種情況下,是否還有另一個Android友好的庫用於整潔的文件處理,還是我必須編寫自己的簡單庫? 也許我在其他地方出錯了。
任何幫助深表感謝。
提前致謝。
這是最不可能的。 GC是應用程序處理的正常部分。 實際上,我敢打賭,如果您的應用程序正忙於執行緩慢的IO,那么系統現在就決定進行清理的好時機。
當然,FileUtils的源是開放的。 它不是特別可怕:
唯一可以說是“過大”的事情是創建復制緩沖區。 默認值為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.