Java 生产中的性能问题

Java 生产中的性能问题,java,performance,garbage-collection,heap,heap-memory,Java,Performance,Garbage Collection,Heap,Heap Memory,嗨,我正在开发一个基于web的java工具。我们的工具有两个实例部署在两个独立的服务器上——一个在生产环境中(许多客户同时使用),另一个在我很少使用的开发环境中。这两个实例(dev和production)都部署在具有相同硬件规格的完全等效的服务器中,具有确切的代码、堆大小、应用程序服务器、版本等 但我观察到生产实例的速度比dev实例慢得多,即使是在客户使用率为零的晚上(我们有工具来监控客户在生产中的使用情况)。这是令人惊讶的,因为所有因素都是相同的。我假设,由于生产实例的使用率很高,因此那里的堆

嗨,我正在开发一个基于web的java工具。我们的工具有两个实例部署在两个独立的服务器上——一个在生产环境中(许多客户同时使用),另一个在我很少使用的开发环境中。这两个实例(dev和production)都部署在具有相同硬件规格的完全等效的服务器中,具有确切的代码、堆大小、应用程序服务器、版本等


但我观察到生产实例的速度比dev实例慢得多,即使是在客户使用率为零的晚上(我们有工具来监控客户在生产中的使用情况)。这是令人惊讶的,因为所有因素都是相同的。我假设,由于生产实例的使用率很高,因此那里的堆几乎是满的和碎片化的,而dev中的堆则是相对自由的和未碎片化的。这就是为什么dev实例要快得多,即使所有的东西都是一样的。这是一个合理的假设吗?因为碎片化的几乎满堆将在对象创建上花费更多的时间,从而降低性能

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

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

但是,如果您还没有对应用程序进行概要分析,我建议您这样做,因为即使您在开发中使用了相当实际的工作负载,您也可以做一些显而易见的简单的事情来提高性能


您确定web扫描仪没有扫描您的服务器吗?(它们通常不睡觉,并且可以在白天/晚上的任何时间处于活动状态)

为什么假定堆是碎片化的?您可以使用VisualGc,一个用于VisualVM的插件来实时分析GC统计数据。您可以将其中一台生产服务器从流量中移除,并对其进行配置


在你的分析中有很多因素需要考虑。延迟、网络/磁盘IO、数据库记录及其大小+索引等

YourKit有10天的免费评估。非常、非常容易使用YourKit比VisualVM的优点之一是它不使用Java进行监控。i、 你不会遇到最大的CPU/内存负载是VisualVM本身的问题。这种模式可能会有所帮助