java.nio.file.Files.exists() 使用大量内存

问题描述 投票:0回答:1

我正在分析我的应用程序,java.nio.file.Files 显示为内存使用的顶级热点(使用 JProfile 进行分析)。

这对我来说没有意义,因为应用程序正在运行大量 XSLT 转换并将结果存储在内存中。虽然它显示为内存使用的顶级竞争者,但我不认为它会被

java.nio.file.Files.exists()
调用超越。

这是导致内存热点的相关代码:

public static FileStatus getFileStatus(Path path) {
  try {
    var exists = Files.exists(path);
    var isDirectory = exists && Files.isDirectory(path);
    var lastModified = exists ? Files.getLastModifiedTime(path).toMillis() : 0;
    var size = exists ? Files.size(path) : 0;

    return new FileStatus(exists, isDirectory, lastModified, size);
  } catch (IOException e) {
    throw new RuntimeException(e);
  }
}

为什么

Files.exists()
占用这么多内存,有没有办法解决内存使用情况?它在 AdoptOpenJDK 11 上运行并在 Windows 10 上运行。

java memory nio
1个回答
0
投票

我无法解释为什么对 Files.exists 的一次调用很慢 - 但它是一种文件系统访问。您使用的所有调用都调用

readAttributes
,因此您可以通过更改为以下内容来减少每次调用 3 倍的文件系统访问量:

public static FileStatus getFileStatus(Path path) {
    try {
        BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
        
        return new FileStatus(true, attrs.isDirectory(), attrs.lastModifiedTime().toMillis(), attrs.isDirectory() ? 0L : attrs.size());
    } catch (IOException e) {
        // Does not exist:
        return new FileStatus(false, false, 0L, 0L);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.