我已将此问题视为可能的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个打开的描述符。