引言
存在若干可用于运行 aix 的 ibm eserver pseries 平台的性能优化工具。运行在 aix 上 ibm 的 java 实现还包含若干调整,其中大多数调整都有相当清楚的文档说明。尽管如此,ibm 支持团队仍然遇到了多种情况,其中性能优化工作受到这两组工具之间的分离影响。
本系列文章向您展示了如何结合使用 aix 和 java 工具,以最大化基于 aix 的 java 应用程序的性能。第 1 部分(“基础”)讨论了实现成功的优化工作的先决条件,并概述了可用于协助此类工作的工具。强烈建议您完整阅读此文,因为它可以在以后为您减少大量的麻烦。
本系列中的接下来三篇文章主要集中于性能优化的特定方面。第 2 部分(“速度需求”)讨论了如何改进执行速度和吞吐量。第 3 部分(“更多就是更好”)着眼于大小调整工作,并阐述了如何能够有利地操作内存。第 4 部分(“监视流量”)研究了作为性能优化目标的网络和磁盘 i/o。编写这三篇文章是为了便于快速查找,因此欢迎您将这些文章作为快速参考,而不是从头到尾地阅读。其中每篇文章还讨论了我们认为在实际工作中非常有用的一般技巧和调整。
第 5 部分(“参考资料和结论”)通过讨论有关此主题的其他信息源,从而结束了本系列。
请注意,本文仅限于 j2se 信息;有关特定于 j2ee 的优化,请参考 j2ee 组件的配套文档。如果您在使用绑定 java 的应用程序,应该参考应用程序文档以确保所做的任何更改不会影响应用程序功能。
开始之前
任何类型的优化工作都必须考虑到若干事项,其中有些事项在性质上是对立的。尽管每一项此类工作都是独特的,但是存在一些通用并且几乎始终有帮助的步骤。下面是在考虑性能优化前需要准备好的事项的简要清单。如果存在任何不能在优化开始之前完成的步骤,就应该存在这样做的充分理由。
迁移到最新版本
有关 aix 上的最新可用 java 版本列表,请参阅 ibm developer kits for aix, java technology edition。较新版本的 java 包含通常具有重要意义的性能增强。例如,与以前版本相比,java 1.4 具有强大得多的收集实现。
即使受到使用特定 java 版本要求的约束,也应该迁移到最新的可用服务更新(service refresh,sr)。这是从功能和性能修复中获益的快速方法。此外,如果遇到任何类型的问题,您将需要迁移到最新的 sr 才能获得支持。对最新 sr 的升级的另一个示例是在 java 1.3.1 已发布之后添加的诸如 -xdisableexplicitgc 等开关,因此除非您迁移到特定的版本,否则无法使用这些开关。
本文着重以 java 1.4 和 java 1.3.1 环境为例,因为较旧的版本要么已经结束服务,要么很快就要结束服务了。由于同样的原因,我们将以 aix 5l(明确地说是 aix 5.1 和 aix 5.2)环境为例,而不是 aix 4.3.3 或更低版本。
如果应用程序的配置可行,您可能还希望考虑迁移到 64 位版本的 java。这一主题超出了本系列的范围;除非特别说明,否则我们将把讨论限制到 32 位 java。请继续关注 esdd 上不久将推出的一篇有关 64 位 java 的文章。
在优化之前修复问题
如果遇到诸如崩溃、内存泄漏或应用程序挂起等问题,那么您还没有为优化工作做好准备。这包括您禁用了 just-in-time (jit) 编译器的部分或全部的情况。如果环境中指定了 java_compiler 或 jitc_compileopt 环境变量,则应用程序可能已经遭受到性能损失(请注意,您也可以使用 jitc_compileopt 来优化应用程序性能。在开始性能优化之前,您应该已经修复了问题,无论是通过升级到最新的服务刷新,还是通过与 ibm java service 团队接洽。ibm developer kits - diagnosis documentation 上的 java diagnostics guide 提供了有关如何调试 ibm java 遇到的任何问题的出色建议。
验证您的环境
您通常不需要担心任何特定的环境设置(前一部分中提到的 jit 设置,以及用于堆大小修改所需要的 ldr_cntrl 设置,是一些值得注意的例外),因为 java 启动程序会自己设置环境。但是,如果应用程序使用 jni,则必须为 jni 组件设置正确的环境。每个 java 版本配套的 sdk 指南或自述文件都提供了需要设置为特定值的变量列表,这其中某个变量不匹配会导致性能和(或)功能问题。
您希望优化的是否为 java?
虽然研究各个技巧并调整 java 应用程序环境是个不错的主意,但是只有在消除其他瓶颈之后才能看到性能影响。例如,如果 java 没有出现在消耗内存最多的前 5 个进程中,如果系统上的其他进程的 cpu 使用率保持在 100%,您对 java 做出的更改很可能不会起作用。
它能运行得更快吗?
性能 这个措词是多方面的,每个角落都需要做出权衡决策。要从任何此类决策中排除猜测成分,必须充分了解预期行为,从而为您提供支持。您还必须拥有任由自己支配的良好定义的机制来测定所做的任何更改的影响。无论优化工作的规模如何,这里描述的步骤都将使优化工作更加高效。
了解您的应用程序特征
在开始优化应用程序之前,必须了解应用程序预期将如何工作。除了诸如客户机-服务器拓扑或图形用户界面(graphical user interface,gui)应用程序等广义分类以外,您还应该了解应用程序代码在内部是如何工作以实现其尝试完成的任务的。举例来说,我们可以向您演示如何计算某次特定运行期间使用的 cpu 百分比值,但是对观察到的数字的解释则是每个应用程序所特有的。您应该能够区分“正常”和“异常”的观察行为,以便决定要优化什么对象。
请注意,您不需要访问 java 源代码即可执行这些文档中描述的大多数优化。这并不意味着您应该将应用程序视为黑盒。您的应用程序是设计为快速完成工作并退出,还是继续运行很长一段时间(例如作为服务器)?它是在启动期间大量地分配内存,还是在启动时仅占用少量内存空间?它是否执行大量的回收,或者它是否占有已分配的对象?诸如此类的问题将决定您的优化工作。
选择优秀的测试套件
我们强烈建议准备某种方法来量化您已实现的收益。使用这其中任何工具的先决条件是存在一个可重复、可验证和可靠的测试套件,此套件允许您检查尽可能多的应用程序功能。记住,在某些情况下,调整运行时行为的一个方面可能会对另一部分造成负面影响。只有优秀的测试套件才使您能够了解运行时性能和内存占用空间(举例而言)之间的权衡。
如果喜欢最大化 aix 上的 java 性能,第 1 部分: 基础请收藏或告诉您的好朋友.
阅读(143) | 评论(0) | 转发(0) |