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
这样做,但我猜这是关于模块的在线更新。
我正在开发富客户端应用程序,现在我将其迁移到 运行 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
这样做,但我猜这是关于模块的在线更新。