я столкнулся ошибка, когда один из наших серверных приложений использовал все больше и больше памяти каждый второй очень много, и мне удалось отфильтровать краткий пример, который все еще показывает, что поведение:Является ли Files.getLastModifiedTime() утечкой памяти?
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.
Via VisualVM Я заметил, что максимальный размер кучи не растет и что куча продолжает расти. Одновременно я наблюдаю в диспетчере задач Windows, что вызванный процесс java.exe продолжает использовать (резервировать) больше памяти каждую секунду.
Самое интересное, что когда я Выполнение GC изнутри VisualVM, все используется куча память получает сброс практически до нуля и использованной памяти процесса java.exe не разборчив, как и следовало ожидать, так как считаются, зарезервированный.
Однако, после того, как GC был сделан, использование памяти по-прежнему увеличивается каждую секунду, а теперь, безусловно, достаточно свободного пространства кучи.
The Metaspace также не подвержен влиянию.
Для меня это действительно пахнет и выглядит как JVM имеет утечку памяти.
Может ли кто-нибудь помочь мне и объяснить, что здесь происходит?
я беру это исключение не брошено? – fge
Так работает сбор мусора. Программа продолжает выделять память, которая в конечном итоге превращается в мусор. Когда он не может выделить больше памяти из свободного пула, он собирает мусор. Будет проблема только в том случае, если куча не уменьшилась * после * GC (независимо от того, запускается ли она автоматически JVM или вручную). – kdgregory
@fge Не исключены исключения – skiwi