创建Java对象时的内存消耗
我对整个主题不熟悉,所以我想问你几个问题 我的程序中有一个功能,在文件系统中搜索与正则表达式匹配的特定文件夹。这意味着,我想在特定文件夹中搜索与特定正则表达式匹配的所有子文件夹。此外,我不想在具有特定文件的特定子文件夹的特定子文件夹中搜索,因此我想排除在这些子文件夹中的搜索。更准确地说,当我在文件夹X中搜索时,我想从搜索中排除X中所有具有特定子文件夹(创建Java对象时的内存消耗,java,memory,garbage-collection,nio,cpu-usage,Java,Memory,Garbage Collection,Nio,Cpu Usage,我对整个主题不熟悉,所以我想问你几个问题 我的程序中有一个功能,在文件系统中搜索与正则表达式匹配的特定文件夹。这意味着,我想在特定文件夹中搜索与特定正则表达式匹配的所有子文件夹。此外,我不想在具有特定文件的特定子文件夹的特定子文件夹中搜索,因此我想排除在这些子文件夹中的搜索。更准确地说,当我在文件夹X中搜索时,我想从搜索中排除X中所有具有特定子文件夹(Person)且其中包含特定文件(personality.xml)的子文件夹 因此,我使用了java.nio的这个“尽可能高效”的特性:Files
Person
)且其中包含特定文件(personality.xml
)的子文件夹
因此,我使用了java.nio的这个“尽可能高效”的特性:Files.walkFileTree
以下是我的实现:
List<Path> paths = new ArrayList<>();
String regex = "myRegex";
Files.walkFileTree(Paths.get("myPathWhereIWantSearchAllSubfoldesr")), new SimpleFileVisitor<>(){
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
if(Files.isHidden(dir)){
return FileVisitResult.SKIP_SUBTREE;
}
if(dir.toFile().getName().contains(regex)){
paths.add(dir);
}
if(Files.exists(Paths.get(String.valueOf(dir), "Config", "ComponentConfig.xml"))){
return FileVisitResult.SKIP_SUBTREE;
}
return FileVisitResult.CONTINUE;
}
});
List path=new ArrayList();
字符串regex=“myRegex”;
Files.walkFileTree(path.get(“myPathWhereIWantSearchAllSubfoldesr”)),新的SimpleFileVisitor(){
@凌驾
公共文件VisitResult preVisitDirectory(路径目录,基本文件属性属性属性)引发IOException{
if(Files.ishiden(dir)){
返回FileVisitResult.SKIP_子树;
}
if(dir.toFile().getName().contains(regex)){
添加路径(dir);
}
if(Files.exists(path.get(String.valueOf(dir),“Config”,“ComponentConfig.xml”)){
返回FileVisitResult.SKIP_子树;
}
返回FileVisitResult.CONTINUE;
}
});
现在我的问题是:
如果我一直为每个文件夹创建一个路径,并查看它是否存在,是否会创建某种永久对象,以某种方式消耗内存?如果是这样,他们会消耗什么样的内存?有没有办法清理这些对象,使它们在搜索过程中不会填满内存或任何垃圾?因为无论如何,在搜索过程中,我认为CPU将被大量使用,如果我将搜索应用到一个巨大的文件夹,我希望避免内存消耗或CPU使用方面的任何开销
非常感谢您的建议、提示或评论。Java是开源的,因此您可以在源代码中查找
文件。walkFileTree
。具体如何取决于您的IDE,在Eclipse中只需点击F3。查看源代码,可以看到事件对象(包含路径)在调用访问者后立即被丢弃。确切地说,我在看Java11