我正在分析我的应用程序,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 上运行。
我无法解释为什么对 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);
}
}