分析Java EE应用程序 - 要查找什么以及要进行哪些更改?

时间:2012-09-13 10:53:12

标签: java refactoring profiling yourkit

我对分析应用程序以提高性能有点新意。我选择了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%!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我绝对同意给定的答案。

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

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

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

答案 2 :(得分:0)

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

分析和优化是一个复杂的野兽,取决于可能的东西(Java版本,32对64位操作系统等等)。此外,优化可能并不总是需要更改代码,例如,您可以通过更改JVM上的GC策略来解决问题 - 例如,在您的代码创建许多需要GCed的小对象的情况下,有更有效的GC策略经常。如果您有具体信息可能会更容易帮助您,但您的问题似乎过于宽泛。事实上,有许多关于主题的书籍可能值得一读。