如何在Java中管理堆空间

时间:2012-05-18 14:57:51

标签: java heap

我正在尝试以递归方式遍历我的云端硬盘以搜索某些文件。 当有限的文件夹/文件时,代码工作正常,但是当我将搜索目标定位到C盘时,我有很多文件,它会抛出堆内存。

线程“Thread-4”中的异常java.lang.OutOfMemoryError:Java堆空间

  1. 请给我一些好的内存管理技巧,特别是在我们进行递归调用时。
  2. 或者给我更好的方法来遍历目录而不会递归。
  3. 并且我不想增加最大允许堆空间,因为它就像暂时推迟问题一样。

    代码:

    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());
                    }
                }
            }
        }
    

3 个答案:

答案 0 :(得分:2)

罪魁祸首,正如我所看到的那样:

fsTree.add(files[id].toString()); // taking list of files

您似乎将每个文件添加到全局数据结构(fsTree),然后在那里搜索。

我的赌注是:

一个。如果你将你的递归函数转换为迭代函数,将不会消失。

B中。如果不是附加到全局数据结构并最终搜索,而是在本地进行搜索/匹配,而只是全局缓存匹配的匹配,消失:

void iterateDirectory (String somedir, String search_term) {

    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) 
            {
               if (/* files[id].isDirectory() MATCHES search_term */)
                 // add to list of matching files:
                 matching_hits.add(files[id].toString());
            } 
            else 
            {
                iterateFilesInDirectory(files[id].getAbsolutePath());
            }
        }
    }
}

答案 1 :(得分:1)

有两种可能性:

  1. 您的代码中存在无限递归(例如,因为您未正确处理.和/或..。如果是这种情况,则必须修复代码。
  2. 您的代码确实需要比可用的更多的堆空间。您有两种选择:
    • 减少进程的内存需求(内存分析器可以帮助您了解使用所有堆空间的内容);
    • 通过指定-Xmx JVM选项来增加堆大小。

答案 2 :(得分:-1)

递归可以做什么,即堆栈/堆使用方面存在限制。请记住,无论你以递归方式做什么,你都可以迭代地做;重写代码以改为使用迭代解决方案。

备用解决方案:java.nio中有一个接口,可用于递归地向下走文件系统的结构。请查看this trailSimpleFileVisitor