我们有一个在 Tomcat 上运行的 Web 应用程序(由第三方开发)。该应用程序的性能一直很差。应用程序开发人员声称,每晚重启 Web 服务器以释放所有内存使用量并重新开始是行业最佳实践。
从客户的角度来看,这缓解了网站在白天崩溃的问题,但从系统管理员的角度来看,这是一个糟糕的解决方案。
我们在不同的服务器上为不同的客户托管了 20 个这样的应用程序,而确保每晚重新启动所有应用程序的协调似乎是错误的。
答案1
这当然不是最佳做法。虽然是最好定期重启服务器以确保一切正常,但每晚都需要重启则表明应用程序存在非常严重的内存泄漏。
答案2
“最佳实践”(许多人出于好意做的事情)与“常见做法”(许多人因为懒惰和/或无知而做的事情)之间是有区别的。
应用程序和(更糟糕的)服务器需要定期重新启动才能保持正常运行是相当常见。但这也清楚地表明你有一个严重的错误。
通过制定定期重启应用程序的标准操作程序,您的公司将一个严重的错误隐藏在地毯下。这是不可原谅的,需要直面并消除这个错误,否则它以后会反过来伤害您。
理想情况下,您的公司应该找到更好的开发人员。不幸的是,这可能会导致大量工作来重写您的大量代码。开发人员要么认为编写糟糕的代码是可以接受的,要么不知道如何识别错误代码的症状,这表明代码质量很低。优秀的开发人员天生就不能让代码处于这种状态。
鉴于您可能无法更换开发人员,这里有几点建议:
- 看看你是否可以让更好的开发人员审查代码,并将他们的评估报告给可以解决问题的人,
- 查看分析工具。如果您具备相关技能和/或意愿,请尝试自己分析代码以查找泄漏并报告。
即使不了解面向开发人员的分析工具,也有很多面向系统管理员的工具可用于分析和监控 Java 应用程序的内存使用情况。无论如何,您都应该在生产服务器上设置内存(特别是堆)监控。即使您正在运行质量代码,我也建议您这样做。当您有缺陷的应用程序即将崩溃时,它可能会提前警告您。
但更好的是,这些应该能帮助你收集到存在泄漏的证据,甚至可能指出问题出在应用程序中的哪个位置。这将为你提供更好的弹药来游说修复它。
答案3
应用程序开发人员更有可能声称,通过绕过他所做的不专业工作来掩盖他自己的利益,这对他自己最有利。他可能没有真正承认他编写的程序存在严重内存泄漏,但距离这一点也相差无几。
答案4
IMO 服务器应尽可能少地关闭。更有可能的是,应用程序开发人员构建了一个存在内存泄漏的劣质应用程序。