评测JavaEE应用程序-要查找什么以及要进行哪些更改?

评测JavaEE应用程序-要查找什么以及要进行哪些更改?,java,refactoring,profiling,yourkit,Java,Refactoring,Profiling,Yourkit,我对评测应用程序以提高性能有点陌生。我已选择您的工具包作为我的探查器。毫无疑问,YourKit提供了非常有趣的统计数据。我陷入困境的是如何处理这些统计数据 例如,考虑一个在JAXB POJO上运行的方法。该方法通过POJO进行迭代,以访问深度嵌套在XML中的标记/元素。这需要4层for循环才能到达元素/标记,如下所示: List<Bundle> bundles = null; List<Item> items = null; for(Info info

我对评测应用程序以提高性能有点陌生。我已选择您的工具包作为我的探查器。毫无疑问,YourKit提供了非常有趣的统计数据。我陷入困境的是如何处理这些统计数据

例如,考虑一个在JAXB POJO上运行的方法。该方法通过POJO进行迭代,以访问深度嵌套在XML中的标记/元素。这需要4层for循环才能到达元素/标记,如下所示:

   List<Bundle> bundles = null;
   List<Item> items = null;
   for(Info info : data) { 
      bundles = info.getBundles();
      for(Bundle bundle : bundles) {
         items = bundle.getItems();
         //.. more loops like this till we get to the required element
       }          
    }
List bundles=null;
列表项=空;
对于(信息:数据){
bundles=info.getBundles();
用于(捆绑包:捆绑包){
items=bundle.getItems();
//…更多这样的循环,直到我们到达所需的元素
}          
}
YourKit告诉我,上面的代码是一个“热点”,每次调用包含此代码的方法,都会收集80个对象的垃圾。上面的代码只是一个示例,并不是我遇到的唯一问题。大多数时候,我不知道如何处理分析器提供的信息。我可以做些什么来减少上述代码中临时对象的数量?是否有明确定义的原则来提高应用程序的性能?分析应用程序时要寻找哪些统计信息,每种统计信息都有哪些含义

编辑:
分析应用程序的主要目标是增加吞吐量和响应时间。当前吞吐量仅为所需吞吐量的10%

关注与绩效目标相关的统计数据。您对最小响应时间感兴趣,所以请查看每个方法对响应时间的贡献,并关注那些对响应时间贡献很大的方法(对于单线程处理,这只是方法调用过程中经过的时间,在该方法的所有调用中求和)。我不确定YourKit将什么定义为热点(查看文档),但它可能是累积时间最长的方法,因此热点是一件值得关注的事情。相反,对象分配对响应时间没有直接影响,在您的情况下是不相关的(除非您已经确定垃圾收集器贡献了很大一部分cpu时间,而它通常不会这样做)。

改进循环的一种方法是更改模式并从本质上扁平化模型,当然,这取决于您是否可以更改模式。这样生成的Java将不需要4层循环。当然,在一天结束的时候,你需要问问自己,代码真的是个问题吗?80个对象都得到了GCD,是吗?您的应用程序运行缓慢吗?您是否遇到内存问题?记住,过早优化是万恶之源


分析和优化是一个复杂的问题,取决于各种因素(Java版本、32位和64位操作系统等)。此外,优化可能并不总是需要更改代码,例如,您可以通过更改JVM上的GC策略来解决问题-例如,在代码创建许多需要频繁GCD的小对象的情况下,有一些GC策略更有效。如果你有细节,也许会更容易帮助你,但你的问题似乎太宽泛了。事实上,有很多关于这个主题的书值得一读。

我完全同意给出的答案

我想补充一点,考虑到您的具体示例,您实际上可以通过使用访问XML中的特定位置来进行改进

在不需要实际迭代整个DOM的情况下,这应该是您的首选,因为它是声明性的,因此更具表现力,更不容易出错


它通常也会给您带来优异的性能(对于非常复杂的查询,情况可能并非如此,但您似乎有一个简单的场景)。

这取决于您的性能目标(响应时间?吞吐量?cpu使用?内存使用?)我主要感兴趣的是吞吐量和响应时间。我们有充足的内存和非常强大的处理器!我们不直接访问XML。JAXB将Apache CXF Web服务接收的XML解组到POJO中。我们接收POJO作为web服务端点的参数。简言之可以将xpath插入JAXB,以便生成的POJO包含使用xpath的方法吗?还请注意,在许多情况下,需要遍历整个DOM,因为应用程序需要遍历每个标记的属性,然后才能从叶标记中提取信息。我不知道有哪种技术允许您将xPath插入JAXB。事实上,这与这项技术的目的背道而驰。很抱歉,但是我忽略了一个事实,即您正在处理JAXB pojo,并且无法直接访问Xml。然而,正如其他人所说的,80个对象的创建和收集对JVM来说并不重要。至于你的一般问题,可能是你看错了地方。您是如何得出这段代码占用时间最多的结论的?YourKit有一个称为热点的东西,它提供了创建大量临时对象并进行垃圾收集的方法。这种特殊的方法出现在热点地区。YourKit还提供了CPU评测的热点。同样的方法也出现在CPU评测热点中。虽然它只执行了20毫秒!