我遇到了一个bug,我们的某个服务器应用程序每秒钟使用的内存越来越多,我已经筛选出一个简短的示例,仍然显示出这种行为:
public class TestGetLastModifiedTime {
private static final Path PATH = Paths.get("D:\\test.txt");
private static final ScheduledExecutorService SCHEDULER = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
SCHEDULER.scheduleAtFixedRate(() -> getLastModifiedTime(), 0, 1, TimeUnit.SECONDS);
}
private static void getLastModifiedTime() {
try {
FileTime lastModifiedTime = Files.getLastModifiedTime(PATH);
} catch (IOException ex) {
throw new UncheckedIOException(ex);
}
}
}
运行在Windows 8.1和Java 8u20上。
通过VisualVM,我观察到最大堆大小不会增长,但堆本身持续增加。同时,我发现在Windows任务管理器中生成的java.exe进程每秒钟都会使用(保留)更多内存。
有趣的是,当我从VisualVM中执行GC时,所有已使用的堆内存都被重置为几乎为零,并且java.exe进程的已用内存并没有像预期的那样收缩,因为它被认为是保留的。
然而,在GC完成后,内存使用仍然会每秒钟增加,尽管现在有足够的空闲堆空间。
元空间也不受影响。
对我来说,这确实像JVM存在内存泄漏。
有人能帮助我解决这个问题并解释一下这里发生了什么吗?
File
对象并使用File.lastModified()
进行比较。 - Pimgd