Netbeans Classloader 在使用签名 jar 加载资源时速度慢

Netbeans Classloader slow on resource loading with signed jar

我正在开发富客户端应用程序,现在我将其迁移到 运行 NetBeans RCP 内。至此一切顺利。

最近我构建了第一个版本,发现启动几乎用了 1 分钟而不是 10 秒。从 IDE 内开始时,一切都和以前一样快。

在对我看到的所有内容进行分析后,加载数千个 XML 文件(JPA 的配置)比以前多了 10-20 倍。我添加了一些 printlns 并看到,每个文件的加载时间大约为 50 毫秒,而不是像以前那样 <1 毫秒。我想通了,问题只发生在签名的 jar 文件上。当我使用未签名的 jar 启动完全相同的应用程序时,它又回到了 10 秒。当我在没有 NetBeans 与签名 jar 集成的情况下启动应用程序时,它也只需要 10 秒。

从代码点来看,该资源的加载根本没有改变。在 运行 时间,差异最有可能出现在类加载中。 NetBeans 提供了一个 class loader hierachy. I tried to set any of these as context class loader, but it makes no difference in performance. I also checked with a memory profiler, the class of classloader 无论有无 NetBeans 集成

我试过分析,但这是一团糟。 profiler(JProfiler) 不显示类加载的堆栈,只显示资源已经加载。即使 java 的“-verbose 选项”也只显示资源已加载。

在不知道确切的类加载算法的情况下,我假设它由以下部分组成。但是这些部分对于我签名的应用程序应该是相同的,无论是否集成了 NetBeans。

  • finding the resource in the classpath
  • loading the resource
  • verifiing
    • test checksum
    • validate certificate with CA (maybe http request, but only once (hopefully))

您是否知道该行为的可能原因。

集成信息:

旧应用程序使用一个 JFrame 和多个 JInternalFrames 来处理多个 windows。当我们开始使用 NetBeans 时,它抓取旧的 JFrame 而不是在 JInternalFrame 中显示我们的内容,我们在动态创建的顶级组件中显示它。集成的主要原因是 window 在 NetBeans 中进行管理(对接、浮动...)。

我自己找的。这是答案,如果有人对此感兴趣的话。

启动时NetBeans调用以下方法,禁用所有缓存。这会导致在每次加载资源时重新加载 jar 文件。对于签名的 jar,这还包括对 jar 的完整验证。

java.net.URLConnection.setDefaultUseCaches(boolean)

我在 JPA 配置期间重新启用了它,它工作正常。我不太确定,为什么 NetBeans 这样做,但我猜这是关于模块的在线更新。