首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理大型Java项目中内存泄漏的最佳实践?

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

Stack Overflow用户
提问于 2010-06-02 18:15:49
回答 4查看 2K关注 0票数 10

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

解决此问题的正确方法显然是追溯问题的根源并修复代码中的漏洞。解决这个问题的快速和肮脏的方法是简单地重新启动Tomcat (或者您正在使用的任何servlet容器)。

以下是我的三个问题:

  • 假设您选择通过跟踪问题的根源(内存泄漏)来解决问题,您将如何收集数据以放大问题?
  • 假设您通过简单地重新启动容器来选择快速和肮脏的加速方式,您将如何收集数据来选择最佳的重新启动周期?
  • 您是否能够在长时间内部署和运行项目,而不需要重新启动servlet容器以恢复快速性?或者是偶尔的servlet重新启动某个必须简单接受的东西?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-02 18:21:16

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

使用jmap进行堆转储,并使用日食内存分析器加载转储。在那里,您可以分析哪些对象消耗了最多的内存,哪些“根”阻止其他对象被收集,等等。

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

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

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

您是否能够在长时间内部署和运行项目,而不需要重新启动servlet容器以恢复快速性?

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

票数 9
EN

Stack Overflow用户

发布于 2010-06-02 19:08:03

即使您的代码没有真正的问题,如果您正在使用apache,也可能会有一些内存泄漏。查看http://www.tomcatexpert.com/blog/2010/04/06/tomcats-new-memory-leak-prevention-and-detection以获得提示和建议

票数 3
EN

Stack Overflow用户

发布于 2010-06-02 18:22:37

有一些很棒的分析工具。学会定期使用内存,并了解内存分配输出。

基本上,对于应用程序的每个重要功能,您都遵循这个过程:

  • 运行过程一次
  • GC两次
  • 标记所有对象的当前分配数。
  • 再次运行您的过程。
  • GC两次
  • 再做标记
  • 区分这两个标记

如果他们不是非常接近,你可能有泄漏。

如果在此过程的每一次迭代中,任何对象计数都会以给定的数量增长,那么绝对会有泄漏。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2960345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档