我正在开发一个富客户端应用程序,现在我将其迁移到NetBeans RCP
内运行。到目前为止一切顺利。
最近我构建了第一个版本并看到,启动花了差不多一分钟而不是10秒。从IDE
开始,一切都和以前一样快。
在对我看到的所有内容进行分析之后,加载数千个XML
文件(JPA
的配置)需要比之前多10到20倍。我添加了一些printlns
并看到,加载大约需要50毫秒而不是像每个文件之前的<1毫秒。我想,问题只发生在已签名的jar文件中。当我使用unsigned jar启动完全相同的应用程序时,它会回到10秒。当我在没有NetBeans
集成签名罐的情况下启动应用程序时,它也只需要10秒钟。
从代码点开始,该资源的加载根本没有改变。在运行时,差异很可能是在类加载中。 NetBeans提供class loader hierachy。我试图将其中任何一个设置为上下文类加载器,但它在性能上没有任何区别。我还检查了内存分析器,使用的class of classloader是否与NetBeans集成相同
我尝试过分析,但这是一团糟。分析器(JProfiler
)不显示已加载资源的类加载堆栈,仅显示。甚至是&#34; -verbose选项&#34;仅显示java,已加载资源。
在不知道确切的类加载算法的情况下,我认为它由以下部分组成。但无论是否使用NetBeans集成,我的签名应用程序的这些部分应该相同。
- 在类路径中查找资源
- 加载资源
- verifiing
- 测试校验和
- 使用CA验证证书(可能是http请求,但只有一次(希望如此))
你有什么想法,可能是这种行为的原因。
整合信息:
旧应用程序使用一个JFrame
和多个JInternalFrames
来处理多个窗口。当我们从NetBeans开始时,它会抓取旧的JFrame
,而不是在JInternalFrame
中显示我们的内容,而是在动态创建的顶级组件中显示它。集成的主要原因是NetBeans中的窗口管理(Docking,Floating ...)。
答案 0 :(得分:1)
我自己找到了。如果其他人对此感兴趣,这就是答案。
启动时NetBeans
调用以下方法,禁用所有缓存。这导致在每次加载资源时重新加载jar文件。对于签名的罐子,这还包括对罐子的完整验证。
java.net.URLConnection.setDefaultUseCaches(boolean)
我重新启用了这个,在JPA
配置期间,它运行正常。我不确定,为什么NetBeans
会这样做,但我想这是关于模块的在线更新。