java - 生产中的性能问题

标签 java performance garbage-collection heap-memory

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

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

最佳答案

大多数 GC 都会执行复制和压缩,以避免任何碎片。只有并发标记清除会产生一些碎片,但是在大多数情况下这不应该成为问题。

我建议您测量系统正在做什么,而不是猜测您的问题是什么。理想情况下,您想要分析您的生产系统。例如夜间或低负载时。例如VisualVM(免费)或 YourKit(更好,但不是免费!)如果这不是一个选项,您可以监视其内存使用情况以及它花费了 GC 的时间。例如使用jstat

但是,如果您尚未分析您的应用程序,我建议您这样做,因为您可能可以采取一些明显且简单的操作来提高性能,即使您在开发中以合理的实际工作负载运行它.

您确定您的服务器没有被网络扫描仪扫描吗? (他们往往不 sleep ,并且可以在白天/晚上的任何时间都很活跃)

关于java - 生产中的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6678724/

相关文章:

java - 我可以拥有比老一代更大的年轻一代吗?

javascript - 了解 JavaScript 中的内存管理,Mozilla

java - 在 Java 中强制输入有效

python - 同时有效地获取 numpy.argmin 和 numpy.amin

c++ - 对齐数据成员和成员函数以提高性能

MySQL 计数行性能

java - "jmap -histo pid"到底打印了什么

java - Oracle GRCC Tcg 数据类型问题

java - 接受其他语言的正则表达式

java - Android 许可证验证响应包含什么用户 ID?