处理大型Java项目中的内存泄漏的最佳实践?

kno*_*orv 10 java performance tomcat

在我参与的几乎所有大型Java项目中,我都注意到应用程序的服务质量随着容器的正常运行时间而降低.这很可能是由于代码中的内存泄漏造成的.

解决此问题的正确方法显然是追溯问题的根本原因并修复代码中的泄漏.解决问题的快速而简单的方法就是重新启动Tomcat(或者您正在使用的任何servlet容器).

这是我的三个问题:

  • 假设您选择通过跟踪问题的根本原因(内存泄漏)来解决问题,您将如何收集数据以放大问题?

  • 假设您通过简单地重新启动容器来选择快速而肮脏的加速方式,您将如何收集数据以选择最佳重启周期?

  • 您是否能够在很长一段时间内部署和运行项目而无需重新启动servlet容器以重新获得快速恢复?或者偶尔的servlet重新启动一个人必须接受的东西?

mat*_*t b 9

假设您选择通过跟踪问题的根本原因(内存泄漏)来解决问题,您将如何收集数据以放大问题?

jmap使用Eclipse Memory Analyzer进行堆转储并加载转储.从那里你可以分析哪些物体占用了最多的记忆,哪些"根"阻止了其他物体被收集等.

还有其他堆分析程序,例如jhat,但我发现EMA是最快和最好的(免费)解决方案.

假设您通过简单地重新启动容器来选择快速而肮脏的加速方式,您将如何收集数据以选择最佳重启周期?

使用JMX监视堆大小以及其他堆和GC统计信息.

您是否能够在很长一段时间内部署和运行项目而无需重新启动servlet容器以重新获得快速恢复?

是.通过避免/修复内存泄漏.