Java 限制JVM打开的文件句柄数,以读取依赖项JAR

Java 限制JVM打开的文件句柄数,以读取依赖项JAR,java,jvm,jetty,Java,Jvm,Jetty,我正在这些集中式业务环境中运行一个JavaWeb应用程序。这在一段时间内工作正常,应用程序使用Jetty运行,但我很快就用完了文件句柄。我首先想到的是,由于我突然得到了NoClassDefFoundErrors,环境中出现了严重的问题。然而,我随后发现JDK中的类加载器在尝试加载类但无法获取包含该类数据的.class文件句柄时,实际上会引发此异常。因此,我认为应用程序有一个我试图调试的句柄泄漏。托管环境对并发句柄的数量有很大的限制 在调试时,我发现确实是JVM本身使这些句柄保持打开状态。Jett

我正在这些集中式业务环境中运行一个JavaWeb应用程序。这在一段时间内工作正常,应用程序使用Jetty运行,但我很快就用完了文件句柄。我首先想到的是,由于我突然得到了
NoClassDefFoundError
s,环境中出现了严重的问题。然而,我随后发现JDK中的
类加载器
在尝试加载类但无法获取包含该类数据的.class文件句柄时,实际上会引发此异常。因此,我认为应用程序有一个我试图调试的句柄泄漏。托管环境对并发句柄的数量有很大的限制

在调试时,我发现确实是JVM本身使这些句柄保持打开状态。Jetty将应用程序的依赖项(只有Spring的可传递依赖项,这些依赖项很多)保存在文件系统上,如下所示

...temp/Jetty_0_0_0_0_8080_myapp.war_spring_something.jar
JVM保持此依赖项和其他依赖项的开放文件句柄。这样,当我添加应用程序本身所需的句柄(web套接字、数据库、文件)时,JVM会保持大约50个打开的句柄,这是太多了

在我开始讨论宝贵服务总线的配置之前,我想知道这是否是:

  • 正常的
  • 可避免

我个人发现,一旦JVM不主动加载类,它就应该关闭这些句柄。然而,我怀疑这是某种优化技术,以避免不断打开jar文件。

这原来是旧版本Jetty中的一个bug。更新到较新的版本使问题消失