Spring ClassPathResource(file).getInputStream()不立即释放资源

时间:2015-02-12 15:08:52

标签: java spring unix resources resource-leak

我已将此问题视为可能的JDK错误:Is JDK ClassLoader.getResourceAsStream broken? (unclosed resources)

我正在从文件中读取属性(有一些间隔):

    try (InputStream propertiesInputStream = 
            new ClassPathResource(FILENAME).getInputStream()) {
                loadedProperties.load(propertiesInputStream);
            } 

但是当我转到/proc/MY_PROCESS_ID/fd并列出已打开的资源时,我看到我的FILENAME属性文件打开了100次或更多次。这是有风险的,因为1024是大多数unix机器的默认限制。

它有时会降为0(看起来像是通过GC调用的finalize()关闭了。)

为什么这些资源在离开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个打开的描述符。

0 个答案:

没有答案