在我参与过的几乎所有较大的Java项目中,我注意到应用程序的服务质量随着容器的正常运行时间而降低。这很可能是由于代码中的内存泄漏。
解决此问题的正确方法显然是追溯问题的根源并修复代码中的漏洞。解决这个问题的快速和肮脏的方法是简单地重新启动Tomcat (或者您正在使用的任何servlet容器)。
以下是我的三个问题:
发布于 2010-06-02 18:21:16
假设您选择通过跟踪问题的根源(内存泄漏)来解决问题,您将如何收集数据以放大问题?
使用jmap进行堆转储,并使用日食内存分析器加载转储。在那里,您可以分析哪些对象消耗了最多的内存,哪些“根”阻止其他对象被收集,等等。
还有其他堆分析程序,如jhat,但我发现EMA是最快、最好(免费)的解决方案。
假设您通过简单地重新启动容器来选择快速和肮脏的加速方式,您将如何收集数据来选择最佳的重新启动周期?
使用JMX来监视堆大小以及其他堆和GC统计信息。
您是否能够在长时间内部署和运行项目,而不需要重新启动servlet容器以恢复快速性?
是。通过避免/修复内存泄漏。
发布于 2010-06-02 19:08:03
即使您的代码没有真正的问题,如果您正在使用apache,也可能会有一些内存泄漏。查看http://www.tomcatexpert.com/blog/2010/04/06/tomcats-new-memory-leak-prevention-and-detection以获得提示和建议
发布于 2010-06-02 18:22:37
有一些很棒的分析工具。学会定期使用内存,并了解内存分配输出。
基本上,对于应用程序的每个重要功能,您都遵循这个过程:
如果他们不是非常接近,你可能有泄漏。
如果在此过程的每一次迭代中,任何对象计数都会以给定的数量增长,那么绝对会有泄漏。
https://stackoverflow.com/questions/2960345
复制相似问题