Я представил эту проблему как возможную ошибку JDK: Is JDK ClassLoader. getResourceAsStream не работает? (незакрытые ресурсы)
Я читаю свойства (с некоторым интервалом) из файла:
try (InputStream propertiesInputStream =
new ClassPathResource(FILENAME).getInputStream()) {
loadedProperties.load(propertiesInputStream);
}
но когда я перехожу к /proc/MY_PROCESS_ID/fd
и перечисляю открытые ресурсы, я вижу, что мой файл свойств FILENAME
открыт даже 100 или более раз. Это рискованно, так как 1024 является ограничением по умолчанию на большинстве Unix-машин.
Иногда он уменьшается до 0 (выглядит как закрытый с помощью finalize() с вызовом GC).
Почему ресурсы не исчезают сразу после выхода из блока try-with-resources?
/proc/TOMCATPID/fd показывает много (в настоящее время > 1000):
lr-x------ 1 MyUserName TomcatUserName 64 Feb 13 01:04 973 -> /opt/project/apache-tomcat-7.0.27/conf/configurationServices.properties
lr-x------ 1 MyUserName TomcatUserName 64 Feb 13 01:04 974 -> /opt/project/apache-tomcat-7.0.27/conf/configurationServices.properties
Я читаю эти свойства 2 раза в минуту, что составляет около 1000 открытых дескрипторов через несколько часов.
./fd
? - person Sotirios Delimanolis   schedule 12.02.2015new Timer()
. Но я думаю, что это не связано с незакрытием. - person Piotr Müller   schedule 13.02.2015