Spring ClassPathResource(file).getInputStream() не сразу освобождает ресурс

Я представил эту проблему как возможную ошибку 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 открытых дескрипторов через несколько часов.


person Piotr Müller    schedule 12.02.2015    source источник
comment
Я не могу воспроизвести это. Можете ли вы показать, что вы видите, если ./fd?   -  person Sotirios Delimanolis    schedule 12.02.2015
comment
@SotiriosDelimanolis Обновлен вопрос со списком fd (ls -l)   -  person Piotr Müller    schedule 13.02.2015
comment
Ваше приложение открывает ресурс в цикле?   -  person Sotirios Delimanolis    schedule 13.02.2015
comment
@SotiriosDelimanolis 2 раза в минуту в TimerTask, запланированном new Timer(). Но я думаю, что это не связано с незакрытием.   -  person Piotr Müller    schedule 13.02.2015
comment
Также рассмотрите возможность добавления вашего дистрибутива Linux и версий Java.   -  person Sotirios Delimanolis    schedule 13.02.2015
comment
Или удалите вопрос :)   -  person Sotirios Delimanolis    schedule 13.02.2015
comment
@SotiriosDelimanolis На самом деле вопрос правильный. Я удалил все другие места, где осуществляется доступ к этому файлу, на 100% уверен, что код перестроен, и это именно тот код и т. д., и все же - использование ресурсов растет. Я постараюсь протестировать с минимальным примером.   -  person Piotr Müller    schedule 13.02.2015
comment
@SotiriosDelimanolis На самом деле я задал новый вопрос, я полагаю, это ошибка JDK или неправильное использование, см.: stackoverflow.com/questions/28496044/   -  person Piotr Müller    schedule 13.02.2015