使用签名jar,Netbeans Classloader在资源加载方面变慢

时间:2015-01-09 12:28:08

标签: java netbeans jar sign

我正在开发一个富客户端应用程序,现在我将其迁移到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 ...)。

1 个答案:

答案 0 :(得分:1)

我自己找到了。如果其他人对此感兴趣,这就是答案。

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

java.net.URLConnection.setDefaultUseCaches(boolean)

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