gpt4 book ai didi

java - 如何在Java中管理堆空间

转载 作者:行者123 更新时间:2023-12-02 07:47:16 24 4
gpt4 key购买 nike

我正在尝试递归地遍历我的云端硬盘来搜索一些文件。当文件夹/文件有限时,代码工作正常,但当我将搜索目标定位到 C 驱动器(其中有很多文件)时,它会抛出堆内存不足。

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

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

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

代码:

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

最佳答案

据我所知,罪魁祸首是这一行:

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

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

我的赌注是:

A.如果您将递归函数“转换”为迭代函数,它不会消失。

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

关于java - 如何在Java中管理堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com