我試圖遞歸遍歷我的雲端硬盤來搜索一些文件。 當有限的文件夾/文件時,代碼工作正常,但是當我將搜索目標定位到C驅動器時,我在其中有大量文件將其從堆內存中拋出。如何管理Java中的堆空間
異常的線程「主題-4」 java.lang.OutOfMemoryError:Java堆空間
- 請建議我一些好的內存管理技巧尤其是當我們做遞歸調用。
- 或者給我更好的方法來遍歷目錄沒有遞歸。
我不想增加最大允許的堆空間,因爲它就像暫緩推遲問題一樣。
代碼:
void iterateDirectory(String somedir) {
File dir = new File(somedir);
File[] files = dir.listFiles();
if (files != null) {
for (int id = 0; id < files.length; id++) {
if (files[id].isDirectory() == false)
{
fsTree.add(files[id].toString()); // taking list of files
}
else
{
iterateFilesInDirectory(files[id].getAbsolutePath());
}
}
}
}
@JeremyHeiler這很可能會令事情更糟糕,錯誤表示它的堆空間不足,而不是堆棧空間。 – Dunes
您究竟如何遞歸?目錄結構是一個「樹」,所以搜索通常是樹的深度優先或寬度優先遍歷。 – ArjunShankar
如果你做得對,深度優先的100級樹遍歷仍然只有100個節點在任何時間點佔用內存。 – ArjunShankar