1

我已经将该问题作为可能的 JDK 错误提出:JDK ClassLoader.getResourceAsStream 损坏了吗?(未关闭的资源)

我正在通过以下方式从文件中读取属性(有一定间隔):

    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 个描述符。

4

0 回答 0