生产中的性能问题

时间:2011-07-13 12:19:01

标签: java performance garbage-collection heap heap-memory

您好我正在开发基于Web的Java工具。我们在两个独立的服务器中部署了两个工具实例 - 一个在生产中(由许多客户同时使用),另一个在我很少使用的开发环境中。实例,开发和生产都部署在具有相同硬件规格的完全相同的服务器中,具有确切的代码,堆大小,应用程序服务器,版本等。

但我观察到生产实例的速度很慢,相比之下,甚至在客户使用率为零的夜晚的奇数小时(我们有工具来监控客户在生产中的使用情况)。这是令人惊讶的,因为所有因素都是相同的。我假设由于生产实例使用率很高,因此堆中的堆几乎已满且碎片化,而dev中的堆相对空闲且未分段。这就是为什么dev实例要快得多,即使一切都相同。这是一个合理的假设,因为碎片几乎完整的堆将花费更多时间在对象创建中,从而降低性能?

2 个答案:

答案 0 :(得分:5)

大多数GC执行复制和压缩,以避免任何碎片。只有并发标记扫描可以得到一些碎片,但在大多数情况下这不应该是一个问题。

我建议你衡量一下系统在做什么,而不是猜测你的问题是什么。理想情况下,您想要分析您的生产系统。例如在夜间或低负荷。例如VisualVM(免费)或YourKit(更好,不是免费的!)如果这不是一个选项,您可以监控其内存使用情况以及花费多少时间进行GCing。例如与jstat

但是,如果您尚未对应用程序进行概要分析,我建议您这样做,因为可能会有一些明显而简单的事情可以帮助您提高性能,即使您在开发时运行相当实际的工作负载也是如此

您确定网络扫描仪没有扫描服务器吗? (他们往往不会睡觉,可以在白天/晚上的任何时间活动)

答案 1 :(得分:0)

为什么假设堆碎片?您可以使用VisualGc,一个可视VM的插件来实时分析GC统计数据。您可以从流量中取出其中一个生产服务器并对其进行分析。

http://java.sun.com/performance/jvmstat/visualgc.html

您的分析需要考虑许多因素。延迟,网络/磁盘IO,数据库记录及其大小+索引等等等。