Ho riscontrato un bug in cui una delle nostre applicazioni server stava usando sempre di più memoria ogni secondo più o meno e sono riuscito a filtrare un breve esempio che mostra ancora che il comportamento:Files.getLastModifiedTime() perde memoria?
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);
}
}
}
esecuzione su Windows 8.1 e Java 8u20.
Tramite VisualVM ho osservato che la dimensione massima dell'heap non aumenta e che lo stesso heap continua ad aumentare. Allo stesso tempo, osservo in Task Manager di Windows che il processo spawn di java.exe continua a utilizzare (riservando) più memoria ogni secondo.
La parte interessante è che quando eseguire GC dall'interno VisualVM, tutta la memoria mucchio utilizzata viene resettato praticamente a zero e la memoria utilizzata del processo java.exe non si restringe, come previsto, in quanto è considerato riservato.
Tuttavia, dopo che il GC è stato eseguito, l'utilizzo della memoria aumenta ancora ogni secondo, mentre ora c'è sicuramente abbastanza spazio libero.
Anche Metaspace non è interessato.
Per me questo odora davvero e sembra che la JVM abbia una perdita di memoria.
Qualcuno può aiutarmi e spiegare cosa sta succedendo qui?
lo prendo non viene generata un'eccezione? – fge
Ecco come funziona la garbage collection. Il programma continua ad allocare memoria che alla fine si trasforma in spazzatura. Quando non può allocare più memoria dal pool gratuito, raccoglie la spazzatura. Ci sarebbe un problema solo se l'heap non diminuisse * dopo * GC (se attivato automaticamente dalla JVM o manualmente). – kdgregory
@fge Non vengono emesse eccezioni – skiwi