JBoss EAP 6.4升级至7.4后应用累积大量未关闭密钥库文件导致打开文件数超限问题咨询
我有个基于Java 1.8的JBoss应用,使用的是旧的JKS格式密钥库,它位于类路径下,通过以下代码加载:
KeyStore.load(getClass().getClassLoader().getResourceAsStream(keystoreLocation), password);
这段代码没有被包裹在try块中,虽然按最佳实践应该确保InputStream被关闭,但之前在EAP 6.4环境下并未出现问题。
升级到EAP 7.4之后,我发现应用最终会耗尽打开文件的限额,抛出如下错误:
java.nio.file.FileSystemException: /opt/jboss-app/deployments: Too many open files
查看/proc/<PID>/fd后,我发现有数千个指向我的JKS密钥库的符号链接条目,数量已经达到了应用用户的4096文件上限,这些条目是在约3周的时间里累积起来的。
在EAP 6.4环境下我完全没有这个问题,而且迁移时的代码改动极少,根本没有碰过密钥库相关的交互逻辑。
配置层面,EAP迁移要求将旧的Web 2.2密钥库配置替换为Elytron TLS配置,供Undertow处理请求使用。
我知道这种升级可能存在很多潜在问题,所以不想问太宽泛的问题。我特别想确认:我的问题有没有可能是EAP 7.4没有关闭getClass().getClassLoader().getResourceAsStream(keystoreLocation)返回的InputStream导致的?
编辑补充:看起来大部分密钥库文件的打开(且未关闭)操作发生在应用的入站API请求期间,但这时候我的应用代码里并没有主动调用keystore.load方法。所以可能这个原因并不成立?
备注:内容来源于stack exchange,提问作者BullroarerTook

