首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中管理堆空间

问如何在Java中管理堆空间
EN

Stack Overflow用户
提问于 2012-05-18 14:57:50
回答 3查看 639关注 0票数 0

我试图递归地遍历我的驱动器来搜索一些文件。当有有限的文件夹/文件时,代码运行良好,但是当我搜索C驱动器时,它会抛出堆内存中的大量文件。

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

  1. 请给我一些好的内存管理技巧,特别是当我们进行递归调用时。
  2. 或者给我更好的方法来遍历目录,而不需要递归。

我不想增加最大允许的堆空间,因为这就像暂时推迟这个问题一样。

代码:

代码语言:javascript
复制
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());
                }
            }
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-18 15:01:40

对于递归可以做什么有一些限制,即与堆栈/堆的使用有关。记住,无论递归地做什么,都可以迭代完成;重写代码来使用迭代解决方案。

替代解决方案:java.nio中有一个接口,可用于递归遍历文件系统的结构。看看这条小径和SimpleFileVisitor。

票数 -1
EN

Stack Overflow用户

发布于 2012-05-18 15:37:44

在我看来,罪魁祸首是这条线:

代码语言:javascript
复制
fsTree.add(files[id].toString()); // taking list of files

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

我打赌:

答:如果你把递归函数“转换”成迭代函数,它就不会消失。

B.如果您在本地进行搜索/匹配,并且只在全局缓存匹配命中,而不是追加到全局数据结构和搜索,它就会消失:

代码语言:javascript
复制
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());
            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-05-18 15:03:25

有两种可能性:

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

​

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10654980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档