评测Java EE应用程序-要查找什么以及要做什么更改



我对分析应用程序以提高性能有点陌生。我已选择YourKit作为我的探查器。毫无疑问,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
       }          
    }

YourKit告诉我,上面的代码是一个"热点",对于包含此代码的方法的每次调用,都会收集80个对象的垃圾。上面的代码只是一个例子,并不是我遇到困难的唯一部分。大多数时候,我不知道该如何处理探查器提供的信息。我可以做些什么来减少上面代码中临时对象的数量?是否有明确的原则来提高应用程序的性能?分析应用程序时要查找哪些统计信息,每种统计信息都有什么含义?

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

关注与绩效目标相关的统计数据。您对最小响应时间感兴趣,因此请查看每个方法对响应时间的贡献程度,并关注那些贡献很大的方法(对于单线程处理,这只是方法调用期间所用的时间,该方法的所有调用的总和)。我不确定YourKit定义的热点是什么(查看文档),但它可能是累积运行时间最高的方法,所以热点是一个好东西。相比之下,对象分配对响应时间没有直接影响,在您的情况下,它是无关紧要的(除非您已经确定垃圾收集器贡献了很大一部分cpu时间,而它通常不会)。

我完全同意给出的答案。

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

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

它通常也会为您提供卓越的性能(对于非常复杂的查询,情况可能并非如此,但您似乎有一个简单的场景)。

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

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

最新更新