剖析 Java EE 应用程序 - 寻找啥以及进行哪些更改?
Posted
技术标签:
【中文标题】剖析 Java EE 应用程序 - 寻找啥以及进行哪些更改?【英文标题】:Profiling a Java EE applications - What to look for and what changes to make?剖析 Java EE 应用程序 - 寻找什么以及进行哪些更改? 【发布时间】:2012-09-13 10:53:12 【问题描述】:我对分析应用程序以提高性能有点陌生。我已选择 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%!
【问题讨论】:
这取决于你的性能目标(响应时间?吞吐量?cpu使用?内存使用?) 我主要对吞吐量和响应时间感兴趣。我们有充足的可用内存和非常强大的处理器! 【参考方案1】:关注与您的绩效目标相关的统计数据。您对最小响应时间感兴趣,因此请查看每种方法对响应时间的贡献,并关注那些贡献很大的方法(对于单线程处理,这只是方法调用期间经过的时间,对该方法的所有调用求和)。我不确定 YourKit 将什么定义为热点(查看文档),但它可能是累积经过时间最长的方法,所以热点是一件好事。相比之下,对象分配对响应时间没有直接影响,并且与您的情况无关(除非您已确定垃圾收集器占 CPU 时间的很大一部分,而它通常不会)。
【讨论】:
【参考方案2】:我完全同意给出的答案。
我想补充一点,考虑到您的具体示例,您实际上可以通过使用xpath api 访问 XML 中的特定位置来进行改进。
在您不需要实际迭代整个 DOM 的情况下,这应该是您的首选,因为它是声明性的,因此更具表现力且不易出错。
它通常也会为您提供卓越的性能(对于非常复杂的查询可能并非如此,但您似乎有一个简单的场景)。
【讨论】:
我们不直接访问 XML。 JAXB 将我们的 Apache CXF Web 服务接收到的 XML 解组为 POJO。我们将 POJO 作为参数接收到我们的 Web 服务端点。简而言之,是否可以将 xpath 插入 JAXB 以使生成的 POJO 包含使用 XPATH 的方法? 还要注意,在许多情况下,遍历整个 DOM 是必要的,因为在从叶子标签中提取信息之前,应用程序需要遍历每个标签的属性 我不知道有一种技术可以让您将 xPath 插入 JAXB。事实上,这与技术的目的相矛盾。很抱歉,但我忽略了您正在处理 JAXB pojo 并且无法直接访问 Xml 的事实。然而,正如其他人所说,创建和收集 80 个对象对 JVM 来说毫无意义。至于你的一般问题,可能是你看错了地方。你是如何断定这段特定的代码是花费最多时间的? YourKit 有一个叫做 Hot Spot 的东西,它为您提供创建大量临时对象和收集垃圾的方法。这种特殊的方法出现在热点中。 YourKit 还提供了 CPU 分析的热点。同样的方法也出现在 CPU 分析热点中。虽然它只执行了 20 毫秒!【参考方案3】:改善循环的一种方法是更改您的架构并从本质上展平模型,当然这取决于您是否可以更改架构。这样生成的 Java 将不需要 4 层循环。当然,在一天结束时,您需要问自己代码真的有问题吗 - 80 个对象正在被 GC 处理,所以?您的应用程序运行缓慢吗?您是否遇到内存问题?请记住,过早的优化是万恶之源!
分析和优化是一头复杂的野兽,并且取决于可能的事情(Java 版本、32 位和 64 位操作系统等)。此外,优化可能并不总是需要更改代码,例如,您可以通过更改 JVM 上的 GC 策略来解决问题 - 例如,在您的代码创建许多需要 GC 的小对象的情况下,有更有效的 GC 策略频繁地。如果您有详细信息,可能会更容易为您提供帮助,但是您的问题似乎太宽泛了。事实上,有很多关于该主题的书籍可能值得一读。
【讨论】:
以上是关于剖析 Java EE 应用程序 - 寻找啥以及进行哪些更改?的主要内容,如果未能解决你的问题,请参考以下文章