【问题标题】:How to debug Java memory errors?如何调试 Java 内存错误?
【发布时间】:2011-09-09 01:28:32
【问题描述】:

在 Tomcat 上运行的 Java Struts 应用程序存在一些内存错误。有时它会变得缓慢并囤积Tomcat的所有内存,直到它崩溃。

我知道如何查找和修复“正常代码错误”,使用测试、调试等,但我不知道如何处理内存错误(如何重现?如何测试?有哪些地方的代码在哪里更常见会产生内存错误?)。

有一个问题:我可以从哪里开始?谢谢

编辑:

IT 部门发送的快照(我没有直接访问生产应用程序)

【问题讨论】:

  • 它是如何崩溃的?任何线程转储?异常堆栈跟踪?
  • 我添加了内存使用情况的快照。他们在任何异常堆栈跟踪之前重新启动服务器。
  • 问“我从哪里开始?”的问题通常过于宽泛,不适合本网站。人们有自己解决问题的方法,因此不可能有正确的答案。仔细阅读 Where to Startedit 您的帖子。

标签: java performance memory-leaks profiling


【解决方案1】:

http://kohlerm.blogspot.com/ 非常好的介绍如何使用 eclipse 内存分析器查找内存泄漏。

如果您喜欢视频教程,请尝试youtube,虽然它是针对 android 的,但信息量很大。

【讨论】:

    【解决方案2】:

    有几个选项 profiler 是其中之一,另一个是将 java 堆转储到文件并使用特殊工具对其进行分析(即 IBM jvm 提供了一个非常酷的工具,称为 Memory Analizer,它提供了非常详细的已分配内存报告在 jvm 崩溃时 - http://www.ibm.com/developerworks/java/jdk/tools/memoryanalyzer/)。 第三种选择是在启用 jmx 服务器的情况下启动您的服务器,并通过 JConsole 连接到它,使用这种方法您将能够在运行时监控内存使用/分配。 JConsole在bin目录下提供了标准的sun jdk(在这里你可以找到如何通过jconsole连接到tomcat - Connecting remote tomcat JMX instance using jConsole

    【讨论】:

      【解决方案3】:

      使用众多“分析器”之一。它们与 JVM 挂钩,可以告诉你每秒创建了多少新对象,以及它们是什么类型等。

      这只是众多之一:http://www.ej-technologies.com/products/jprofiler/overview.html 这个我用过,还行。

      【讨论】:

      • +1 分析器可以解决错误,当问题可重现时。如果问题是可重现的,那么它即将被修复。
      • @Markus,我想说分析器帮助发现错误,如果他们也能解决它们,我们都会失业。 ;)
      【解决方案4】:

      您应该在分析器(例如 jprofile 或 yourkit)下运行它一段时间,然后查看内存/资源使用情况。也尝试进行线程转储。

      【讨论】:

        【解决方案5】:

        如果您的应用程序变得缓慢,您可以创建一个堆转储并将其与系统处于健康状态时创建的另一个堆转储进行比较。寻找更大数据结构的差异。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-28
          • 2011-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-20
          • 2011-12-08
          • 2013-03-01
          相关资源
          最近更新 更多